GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
/
Show response
www.golem.de/
|
191 KB
44 KB
|
63ms
19ms
|
Document
text/html |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_137-min.css
www.golem.de/staticrl/styles/
|
76 KB
21 KB
|
16ms
15ms
|
Stylesheet
text/css |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
metaTag.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
|
281 KB
64 KB
|
30ms
14ms
|
Script
application/javascript |
2a02:26f0:64:493::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
logo-g.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
31ms
14ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146690-222467-222465_rc.jpg
www.golem.de/2002/
|
25 KB
25 KB
|
45ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146684-222444-222440_rc.jpg
www.golem.de/2002/
|
7 KB
8 KB
|
35ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146693-222480-222477_rc.jpg
www.golem.de/2002/
|
8 KB
8 KB
|
38ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146190-220706-220702_rc.jpg
www.golem.de/2002/
|
10 KB
10 KB
|
34ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146692-222476-222473_rc.jpg
www.golem.de/2002/
|
8 KB
9 KB
|
22ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146680-222431-222430_rc.jpg
www.golem.de/2002/
|
4 KB
4 KB
|
19ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
61ms
16ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
isslego-snap.jpg
video.golem.de/teaser/1/1/24100/thumb-high-1000/
|
186 KB
186 KB
|
60ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
wearable-microphone-jammer.jpg
video.golem.de/teaser/1/1/24095/thumb-high-1000/
|
60 KB
60 KB
|
44ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
43ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146638-222282-222281_rc.jpg
www.golem.de/2002/
|
184 KB
184 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146562-222011-222008_rc.jpg
www.golem.de/2002/
|
79 KB
79 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
200210-akademie_kubernetes1.jpg
www.golem.de/_img/
|
72 KB
72 KB
|
16ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.js
Show response
www.golem.de/staticrl/scripts/
|
100 KB
41 KB
|
21ms
16ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
longread-swiper_133-min.js
Show response
www.golem.de/staticrl/scripts/
|
2 KB
1 KB
|
14ms
14ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
account_js_rl19_1_1.php
Show response
www.golem.de/abo/
|
4 KB
3 KB
|
21ms
15ms
|
Script
application/javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
107 KB
38 KB
|
21ms
21ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
golem_csi-133-min.js
Show response
www.golem.de/staticrl/scripts/adsense/
|
2 KB
1 KB
|
14ms
14ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sdcv.js
Show response
ads.golem.de/
|
63 B
402 B
|
60ms
14ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
38 KB
11 KB
|
100ms
34ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
43 KB
15 KB
|
180ms
64ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
272 KB
84 KB
|
232ms
79ms
|
Script
application/javascript |
13.224.194.125
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
126 KB
49 KB
|
168ms
60ms
|
Script
text/javascript |
23.210.248.245
AKAMAI-AS
|
|
|
GET
H/1.1
|
302
Moved Temporarily
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
0
-1 B
|
108ms
43ms
|
XHR
text/plain |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H2
|
200
|
nuggad
Show response
nugmw.userreport.com/rc-ap/5edaad24-fae7-49a8-9b2e-5704c1eb409c/si.nuggad.net/
Redirect Chain
-
https://si.nuggad.net/rc?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
-
https://nugmw.userreport.com/rc-ap/5edaad24-fae7-49a8-9b2e-5704c1eb409c/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=2088753725&nuggtg=&nuggrid=https%3A%2F%2Fwww.golem.de%2F
|
2 KB
2 KB
|
41ms
24ms
|
Script
text/javascript |
2600:9000:20eb:4400:1f:a1b:34c0:93a1
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
|
22 KB
22 KB
|
15ms
14ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
|
22 KB
22 KB
|
15ms
15ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
|
21 KB
21 KB
|
14ms
14ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
325 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
258 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
14ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
126 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
147 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
153 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
768 B
0
|
|
Image
image/svg+xml |
|
|
|
GET
H/1.1
|
200
OK
|
btn-follow-sp4b.png
www.golem.de/staticrl/images/
|
3 KB
3 KB
|
15ms
14ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
|
26 KB
26 KB
|
15ms
14ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
|
97 B
622 B
|
42ms
42ms
|
XHR
application/json |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fsky,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbanner,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstart...
Show response
s385.mxcdn.net/679600/
|
2 KB
2 KB
|
143ms
45ms
|
XHR
application/json |
23.210.248.245
AKAMAI-AS
|
|
General
- Full URL
- https://s385.mxcdn.net/679600/%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fsky,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbanner,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fbillboard2,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Fposterad,%2F4444%2Fdisp_ctc_golem.de_sd%2Fstartseite%2Frectangle2
- Requested by
- Host: cdn.stroeerdigitalgroup.de
URL: https://cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/metaTag.min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
23.210.248.245
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-210-248-245.deploy.static.akamaitechnologies.com
- Software
-
nginx/1.10.3 /
- Resource Hash
- 7e10610b0758367dde188c05b446dcafe1329722cc0be0a78c58174436e2db91
|
GET
H/1.1
|
200
OK
|
gx-ads.js
Show response
ads.golem.de/track.ads/
|
226 B
566 B
|
14ms
14ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:17a
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:814::2002
GOOGLE
|
|
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
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:814::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl_fy2019.js
Show response
pagead2.googlesyndication.com/pagead/js/r20200212/r20190131/
|
221 KB
83 KB
|
29ms
28ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20200212/r20190131/show_ads_impl_fy2019.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 51306b94354b978995db93f41f35703be797c4ae698013ffac3a20810d1947ae
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20200212/r20190131/
Frame 73A6
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81d::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20200212/r20190131/zrt_lookup.html
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81d::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
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&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2FLondon%2C%20City%20of&cb=001e&i2=001eda52d96cc431a5e4bc422&ep=1608910068&...
-
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2FLondon%2C%20City%20of&cb=001e&i2=001eda52d96cc431a5e4bc422&ep=1608910068&...
|
0
694 B
|
42ms
42ms
|
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&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=GB%2FLondon%2C%20City%20of&cb=001e&i2=001eda52d96cc431a5e4bc422&ep=1608910068&vr=416&id=sxnjyl&i3=001eda52d96cc431a5e4bc422%3A1613214115157%3A1582023715157%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1582023715157&n1=1&dntt=0<=1582023715158&ev=&cs=anl65y&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.06.2 001e
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
IjvnOpbzskTW
Show response
cdn.onthe.io/io.js/
|
72 KB
27 KB
|
190ms
74ms
|
Script
text/javascript |
142.93.164.210
DIGITALOCEAN-ASN
|
|
|
GET
H2
|
200
|
js
Show response
www.googletagmanager.com/gtag/
|
74 KB
28 KB
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:817::2008
GOOGLE
|
|
|
GET
H/1.1
|
404
Not Found
|
ping
account.golem.de/
|
0
0
|
61ms
15ms
|
Script
text/plain |
2a00:13c8:f5::f:4b3d:180
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://account.golem.de/ping?callback=jQuery224009108177262443351_1582023715099&_=1582023715100
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2a00:13c8:f5::f:4b3d:180
, Germany,
ASN25291
(SYSELEVEN SysEleven GmbH, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
|
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
|
15ms
15ms
|
XHR
application/x-javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_cpxl_113-min.js
Show response
www.golem.de/staticrl/scripts/
|
8 KB
4 KB
|
15ms
14ms
|
Script
application/x-javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
final-fantasy-vii-eroeffnungssequenz.jpg
video.golem.de/teaser/1/1/24087/thumb-high-1000/
|
91 KB
92 KB
|
17ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
the-iron-mask-trailer.jpg
video.golem.de/teaser/1/1/24081/thumb-high-1000/
|
75 KB
75 KB
|
21ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
dji-stellt-funk-drohnenkennzeichen-vor-(herstellervideo).jpg
video.golem.de/teaser/1/1/24096/thumb-high-1000/
|
54 KB
54 KB
|
36ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146691-222472-222469_rc.jpg
www.golem.de/2002/
|
8 KB
8 KB
|
20ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146689-222463-222460_rc.jpg
www.golem.de/2002/
|
9 KB
9 KB
|
18ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144569-215870-215866_rc.jpg
www.golem.de/2002/
|
7 KB
7 KB
|
16ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146688-222455-222454_rc.jpg
www.golem.de/2002/
|
6 KB
7 KB
|
20ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
145500-216791-216788_rc.jpg
www.golem.de/1912/
|
5 KB
5 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146504-221626-221622_rc.jpg
www.golem.de/2002/
|
113 KB
113 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146663-222355-222352_rc.jpg
www.golem.de/2002/
|
6 KB
6 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146686-222453-222450_rc.jpg
www.golem.de/2002/
|
5 KB
6 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146677-222418-222413_rc.jpg
www.golem.de/2002/
|
11 KB
12 KB
|
16ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146685-222449-222448_rc.jpg
www.golem.de/2002/
|
7 KB
8 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146683-222439-222436_rc.jpg
www.golem.de/2002/
|
7 KB
7 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146633-222221-222217_rc.jpg
www.golem.de/2002/
|
8 KB
8 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146374-221526-221525_rc.jpg
www.golem.de/2002/
|
7 KB
7 KB
|
16ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146682-222435-222432_rc.jpg
www.golem.de/2002/
|
7 KB
7 KB
|
16ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146664-222359-222356_rc.jpg
www.golem.de/2002/
|
8 KB
8 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146356-220903-220900_rc.jpg
www.golem.de/2001/
|
9 KB
9 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146679-222422-222419_rc.jpg
www.golem.de/2002/
|
7 KB
8 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146678-222412-222409_rc.jpg
www.golem.de/2002/
|
7 KB
7 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146676-222408-222405_rc.jpg
www.golem.de/2002/
|
7 KB
8 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146675-222404-222401_rc.jpg
www.golem.de/2002/
|
6 KB
7 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146674-222400-222397_rc.jpg
www.golem.de/2002/
|
6 KB
7 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146673-222396-222393_rc.jpg
www.golem.de/2002/
|
10 KB
10 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146672-222392-222389_rc.jpg
www.golem.de/2002/
|
4 KB
4 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146671-222388-222385_rc.jpg
www.golem.de/2002/
|
6 KB
6 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146670-222384-222381_rc.jpg
www.golem.de/2002/
|
5 KB
5 KB
|
488ms
488ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146669-222380-222376_rc.jpg
www.golem.de/2002/
|
5 KB
6 KB
|
16ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146668-222375-222372_rc.jpg
www.golem.de/2002/
|
6 KB
6 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
146666-222371-222368_rc.jpg
www.golem.de/2002/
|
7 KB
7 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146591-222020-222018_rc.jpg
www.golem.de/2002/
|
18 KB
18 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146511-221659-221657_rc.jpg
www.golem.de/2002/
|
18 KB
18 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146551-221831-221829_rc.jpg
www.golem.de/2002/
|
19 KB
19 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146351-220983-220981_rc.jpg
www.golem.de/2002/
|
19 KB
19 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146577-221953-221951_rc.jpg
www.golem.de/2002/
|
22 KB
22 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146524-221711-221709_rc.jpg
www.golem.de/2002/
|
18 KB
18 KB
|
15ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146519-221686-221684_rc.jpg
www.golem.de/2002/
|
21 KB
22 KB
|
14ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143062-204818-204816_rc.jpg
www.golem.de/2002/
|
19 KB
19 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146270-221412-221410_rc.jpg
www.golem.de/2002/
|
32 KB
32 KB
|
16ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146558-221866-221861_rc.jpg
www.golem.de/2002/
|
14 KB
14 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146486-221597-221595_rc.jpg
www.golem.de/2002/
|
21 KB
21 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146461-221430-221428_rc.jpg
www.golem.de/2002/
|
29 KB
29 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146340-220825-220823_rc.jpg
www.golem.de/2002/
|
23 KB
24 KB
|
16ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146419-221281-221279_rc.jpg
www.golem.de/2002/
|
18 KB
18 KB
|
17ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_146372-221334-221332_rc.jpg
www.golem.de/2002/
|
22 KB
22 KB
|
15ms
14ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cpx.php
cpx.golem.de/
|
42 B
420 B
|
59ms
14ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:182
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 7FBC
|
0
0
|
244ms
244ms
|
Document
text/html |
2a00:1450:4001:81d::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=9659475789&adk=106988496&adf=2993371392&w=680&lmt=1582023715&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1582023715113&bpp=14&bdt=251&fdt=110&idt=110&shv=r20200212&cbv=r20190131&ptt=9&saldr=aa&abxe=1&correlator=446872626256&frm=20&pv=2&ga_vid=1740209142.1582023715&ga_sid=1582023715&ga_hid=1281978336&ga_fc=0&iag=0&icsg=3341526564544&dssz=45&mdo=0&mso=0&u_tz=60&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=293&ady=3990&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065304&oid=3&pvsid=93674494401404&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=1&uci=a!1&btvi=1&fsb=1&xpc=jA3geq8vfG&p=https%3A//www.golem.de&dtd=126
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200212/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81d::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
|
74 KB
27 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200212/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 98338d687e5f0016e85ba80b4de3c9c887e4dd4eb9ea5ac225ef1de42d149eb3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
|
167 KB
61 KB
|
81ms
81ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
rmpslider-rl_133-min.js
Show response
www.golem.de/staticrl/scripts/radiant/
|
21 KB
9 KB
|
22ms
14ms
|
XHR
application/x-javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_wLxGC9-144465_rc.jpg
www.golem.de/8977/
|
68 B
463 B
|
42ms
41ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame AD50
|
0
0
|
293ms
293ms
|
Document
text/html |
2a00:1450:4001:81d::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=150&slotname=2178223976&adk=2940155785&adf=3103571475&w=680&lmt=1582023715&rafmt=11&psa=0&guci=1.2.0.0.2.2.0.0&format=680x150&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1582023715127&bpp=5&bdt=265&fdt=198&idt=198&shv=r20200212&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=680x150&correlator=446872626256&frm=20&pv=1&ga_vid=1740209142.1582023715&ga_sid=1582023715&ga_hid=1281978336&ga_fc=0&iag=0&icsg=48550478675648&dssz=47&mdo=0&mso=0&u_tz=60&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=293&ady=4699&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065304&oid=3&pvsid=93674494401404&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=144&bc=31&ifi=2&uci=a!2&btvi=2&fsb=1&xpc=bTczgNhHXw&p=https%3A//www.golem.de&dtd=201
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200212/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81d::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
58ms
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
|
58ms
17ms
|
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
|
59ms
17ms
|
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
|
59ms
17ms
|
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
|
59ms
17ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
701 B
|
455ms
116ms
|
XHR
application/json |
52.217.37.46
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
rmp-hcjson.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
291 B
663 B
|
56ms
14ms
|
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
|
17ms
17ms
|
XHR
application/x-javascript |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
87 KB
25 KB
|
168ms
65ms
|
Script
application/javascript |
13.225.86.250
AMAZON-02
|
|
|
POST
H2
|
204
|
session
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
88ms
28ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
POST
H2
|
204
|
auction
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
78ms
29ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
submit
lb3.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
133ms
32ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/bb-mx/submit?/3LdXBRAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSnDDPAAAAAAAAAOAAAAGCAAAAAAZwSnDDBRksFAQtjFUrjuSA
- 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
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
143ms
34ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
|
GET
H2
|
200
|
nuggad
ih.adscale.de/
|
49 B
278 B
|
96ms
33ms
|
Image
image/gif |
18.185.150.7
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
105ms
33ms
|
Script
application/javascript |
23.210.249.210
AKAMAI-AS
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
44 KB
18 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:80b::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtag/js?id=UA-518800-2
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- eaf1b128b927ac2868755cb7366d35554255c8af362235afe270f9614f8c806d
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
257 B
1 KB
|
202ms
49ms
|
XHR
application/json |
13.224.194.16
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 5296
|
0
0
|
15ms
15ms
|
Document
text/html |
2a00:1450:4001:81d::2002
GOOGLE
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1582023715&plat=1%3A32776%2C2%3A32776%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C17%3A32%2C24%3A32%2C25%3A32%2C30%3A1081344%2C32%3A32%2C40%3A32&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1582023715201&bpp=4&bdt=339&fdt=268&idt=268&shv=r20200212&cbv=r20190131&ptt=9&saldr=aa&abxe=1&prev_fmts=680x150%2C680x150&nras=1&correlator=446872626256&frm=20&pv=1&ga_vid=1740209142.1582023715&ga_sid=1582023715&ga_hid=1281978336&ga_fc=0&iag=0&icsg=194201920798400&dssz=49&mdo=0&mso=0&u_tz=60&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=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21065304&oid=3&pvsid=93674494401404&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=4&uci=a!4&fsb=1&dtd=273
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200212/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81d::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
sp_wLxGC9-101963_rc.jpg
www.golem.de/4670/adinclude/
|
68 B
463 B
|
42ms
42ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_wLxGC9-198608_rc.jpg
www.golem.de/2789/adinclude/
|
68 B
463 B
|
43ms
42ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
96ms
32ms
|
XHR
text/javascript |
188.40.115.111
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_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:10ef19476.67cf41955_1582023715501,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1582023715503
- 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.115.111
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.111.115.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
|
94ms
31ms
|
Script
text/html |
188.40.115.111
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
93ms
31ms
|
XHR
text/javascript |
188.40.115.111
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_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:10ef19476.67cf41955_1582023715501,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=10ef19476.67cf41955_1582023715501&1582023715507
- 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.115.111
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.111.115.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
|
94ms
31ms
|
XHR
text/javascript |
188.40.115.111
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_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36,device:desktop,browser_version:Other%2074,browser:Other,depth:1,user_type:new,user_id:10ef19476.67cf41955_1582023715501,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1582023715508
- 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.115.111
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.111.115.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
417 B
858 B
|
313ms
312ms
|
XHR
text/plain |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=93674494401404&correlator=1378796388923885&output=ldjh&impl=fifs&adsid=NT&eid=21065400%2C21062832%2C21065112%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200218&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C480x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D72c5521d51f4e1601a65d8033e3ced40%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-3%252Cn155-0%252Cn106-0%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-1%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-1%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn30-2%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-1%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-1%252Cn9-0%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-0%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-2%252Cn82-1%252Cn33-1%252Cn84-1%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-1%252Cn44-1%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc&cookie_enabled=1&bc=31&abxe=1&lmt=1582023715&dt=1582023715532&dlt=1582023714862&idt=655&frm=20&biw=1585&bih=1200&oid=3&adxs=393&adys=2822&adks=3874908706&ucis=1&ifi=5&u_tz=60&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=50&icsg=194201920798400&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x450&msz=1000x450&ga_vid=1740209142.1582023715&ga_sid=1582023715&ga_hid=1281978336&fws=0&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 5343e36f714ae9229cd99ad0d5bc4decfb438992570872aa377e61ca17608949
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
|
66 KB
24 KB
|
66ms
65ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
|
0
0
|
7ms
6ms
|
Other
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
POST
H2
|
200
|
collect
Show response
www.google-analytics.com/j/
|
2 B
95 B
|
13ms
13ms
|
XHR
text/plain |
2a00:1450:4001:80b::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/j/collect?v=1&_v=j81&aip=1&a=1281978336&t=pageview&_s=1&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=IAhAAcABAAAAAC~&jid=2000812979&gjid=266126661&cid=1740209142.1582023715&tid=UA-518800-2&_gid=1446552986.1582023716&_r=1>m=2ou250&z=755100160
- Requested by
- Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- de3246094525b21a870fc7d2a67490d0132535c6fa5993755c549f1a9d1bd8af
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:80b::200e
GOOGLE
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j81&aip=1&a=1281978336&t=timing&_s=2&dl=https%3A%2F%2Fwww.golem.de%2F&ul=en-us&de=UTF-8&dt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&utc=JS%20Dependencies&utv=load&utt=400&_u=IAhAAcABAAAAAC~&jid=&gjid=&cid=1740209142.1582023715&tid=UA-518800-2&_gid=1446552986.1582023716>m=2ou250&z=1841820603
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
vgs.json
Show response
cdn.radiantmediatechs.com/rmp/rr/
|
6 KB
3 KB
|
29ms
11ms
|
XHR
application/json |
2606:4700:20::681a:2cd
CLOUDFLARENET
|
|
|
GET
H/1.1
|
200
OK
|
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
|
57 KB
12 KB
|
16ms
15ms
|
Stylesheet
text/css |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
|
33 KB
8 KB
|
102ms
33ms
|
Script
text/javascript |
151.101.13.194
FASTLY
|
|
|
POST
H2
|
200
|
collect
Show response
stats.g.doubleclick.net/j/
|
1 B
122 B
|
14ms
14ms
|
XHR
text/plain |
2a00:1450:400c:c00::9c
GOOGLE
|
|
General
- Full URL
- https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j81&tid=UA-518800-2&cid=1740209142.1582023715&jid=2000812979&gjid=266126661&_gid=1446552986.1582023716&_u=IAhAAcAAAAAAAC~&z=1935982359
- Requested by
- Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c00::9c
Brussels, Belgium,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
106ms
39ms
|
XHR
application/javascript |
13.225.86.250
AMAZON-02
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
|
267 KB
91 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:809::200a
GOOGLE
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
68 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
23 B
368 B
|
98ms
98ms
|
XHR
text/javascript |
13.225.86.250
AMAZON-02
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3505&u=https%3A%2F%2Fwww.golem.de%2F&pid=c1rMdv2txlcDl&cb=0&ws=1600x1200&v=7.47.00&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22120x600%22%2C%22200x600%22%2C%22301x601%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x600_1%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_970x250_1%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x600%22%2C%22300x250%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x600_2%22%7D%2C%7B%22sd%22%3A%223%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_970x250_4%22%7D%2C%7B%22sd%22%3A%224%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22%2F3505%2Fgolem.de_d_300x250_2%22%7D%5D&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
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.225.86.250
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-225-86-250.fra2.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- 745a085b52b8371ec6705413fca70a28c6d8bff0db480e6b124bd08c54e95ef8
|
GET
DATA
|
200
OK
|
truncated
/
|
2 KB
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
715 B
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
|
15ms
14ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:148
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
|
15ms
14ms
|
Font
application/octet-stream |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
|
201 KB
59 KB
|
49ms
48ms
|
XHR
application/javascript |
13.224.194.16
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
|
1 KB
1 KB
|
15ms
14ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
|
924 B
1 KB
|
15ms
14ms
|
Image
image/png |
2a00:13c8:f5::f:4b3d:148
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
46ms
45ms
|
Script
text/javascript |
23.37.53.21
AKAMAI-AS
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=0&n121=2&n116=0&n104=1&n15=3&n155=0&n106=0&n52=2&n153=1&n11=1&n120=3&n154=1&n125=1&n8=1&n137=0&n101=0&n108=0&n54=0&n110=1&n87=0&n149=0&n76=1&n66=1&n60=1&n139=1&n160=1&n107=1&n21=1&n40=1&n117=2&n86=0&n147=4&n64=0&n119=3&n30=2&n18=1&n161=1&n126=1&n92=1&n62=1&n57=1&n77=0&n83=0&n102=1&n105=1&n159=1&n20=1&n80=0&n12=6&n141=0&n157=1&n99=1&n128=2&n118=6&n85=1&n9=0&n6=2&n63=0&n58=1&n38=2&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=3&n90=1&n43=1&n142=0&n7=2&n103=0&n158=0&n124=1&n75=0&n91=0&n46=1&n114=1&n69=0&n10=1&n3=2&n82=1&n33=1&n84=1&n5=5&n109=0&n122=1&n67=0&n115=1&n89=2&n123=2&n17=1&n78=1&n44=1&n81=1&n88=1&n39=1&n156=1&n148=0
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- Protocol
- HTTP/1.1
- Security
- TLS 1.3,
, AES_256_GCM
- Server
-
23.37.53.21
, Netherlands,
ASN16625
(AKAMAI-AS, US),
- Reverse DNS
- a23-37-53-21.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- e433355dd52101d252b7764e0a5fcf81b5cb5df584a0f22b077abc645ea04d5a
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
32ms
31ms
|
XHR
text/javascript |
188.40.115.111
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/202001101133/
|
33 KB
12 KB
|
33ms
33ms
|
Script
application/javascript |
151.101.13.194
FASTLY
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/202001101133/wrap.js
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/config.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.194
Frankfurt am Main, Germany,
ASN54113
(FASTLY, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- cf1091e08a0a0c7b7e407014d53bda0223573859d06351c958a1174479a77752
|
POST
H2
|
204
|
bid
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
58 KB
8 KB
|
584ms
584ms
|
XHR
text/plain |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=93674494401404&correlator=1378796388923885&output=ldjh&impl=fifs&adsid=NT&eid=21065400%2C21062832%2C21065112%2C21065304&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200218&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2%2C0%2F1%2F2&prev_iu_szs=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C728x90%7C728x180%7C1000x150%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31%2C20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32%2C10x10%7C301x250%7C300x126%7C34x32&prev_scp=as%3Dsky%26adslot%3Dsky%26af%3Dfirepl%2Cwp%2Cvidwa%2Cf1x4%2Cf1x3%2Cf1x2%2Cds%2Cdds%2Csky%2Chpad%2Cband%26rfree%3D200-299%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17298.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%7Cas%3Dbanner%26adslot%3Dbanner%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17295.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2Cvto%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17299.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17299.sb%253Af%26yieldlove_pid%3D17299%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec%7Cas%3Dbillboard2%26adslot%3Dbillboard2%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A18494.scenario%253Adefault%26yieldlove_meta%3Dpid%253A18494.sb%253Af%26yieldlove_pid%3D18494%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbillboard2%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cf10x1%7Cas%3Drectangle2%26adslot%3Drectangle2%26pc%3D1%26mtrcskv%3D50-1_75%2C60-1_100%2C65-1_75%2C70-1_75%2C80-1_75%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A17300.scenario%253Adefault%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26mbrid%3D72c5521d51f4e1601a65d8033e3ced40%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-0%252Cn121-2%252Cn116-0%252Cn104-1%252Cn15-3%252Cn155-0%252Cn106-0%252Cn52-2%252Cn153-1%252Cn11-1%252Cn120-3%252Cn154-1%252Cn125-1%252Cn8-1%252Cn137-0%252Cn101-0%252Cn108-0%252Cn54-0%252Cn110-1%252Cn87-0%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-1%252Cn107-1%252Cn21-1%252Cn40-1%252Cn117-2%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-3%252Cn30-2%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-1%252Cn62-1%252Cn57-1%252Cn77-0%252Cn83-0%252Cn102-1%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-6%252Cn141-0%252Cn157-1%252Cn99-1%252Cn128-2%252Cn118-6%252Cn85-1%252Cn9-0%252Cn6-2%252Cn63-0%252Cn58-1%252Cn38-2%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-3%252Cn90-1%252Cn43-1%252Cn142-0%252Cn7-2%252Cn103-0%252Cn158-0%252Cn124-1%252Cn75-0%252Cn91-0%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-1%252Cn3-2%252Cn82-1%252Cn33-1%252Cn84-1%252Cn5-5%252Cn109-0%252Cn122-1%252Cn67-0%252Cn115-1%252Cn89-2%252Cn123-2%252Cn17-1%252Cn78-1%252Cn44-1%252Cn81-1%252Cn88-1%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc&cookie_enabled=1&bc=31&abxe=1&lmt=1582023715&dt=1582023715836&dlt=1582023714862&idt=655&frm=20&biw=1585&bih=1200&oid=3&adxs=1378%2C783%2C1138%2C783%2C1138&adys=0%2C130%2C788%2C1357%2C4073&adks=2242890686%2C1956608835%2C2740773112%2C366944190%2C2251274322&ucis=2%7C3%7C4%7C5%7C6&ifi=6&u_tz=60&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=55&icsg=3421723672443648&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=160x40%7C1000x10%7C300x20%7C1000x10%7C300x12&msz=160x40%7C1000x10%7C300x20%7C1000x10%7C300x10&ga_vid=1740209142.1582023715&ga_sid=1582023715&ga_hid=1281978336&fws=0%2C0%2C0%2C0%2C0&ohw=0%2C0%2C0%2C0%2C0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 0669cfdf55f76a21dfc4792bceba5f5aee3984f4427c8e5bcc03634dd8969857
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
bridge3.367.1_de.html
imasdk.googleapis.com/js/core/
Frame 89FB
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:809::200a
GOOGLE
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.367.1_de.html
- Requested by
- Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
client.js
Show response
s0.2mdn.net/instream/video/
|
26 KB
10 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:820::2006
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=72c5521d51f4e1601a65d8033e3ced40&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D72c5521d51f4e1601a65d8033e3ced40%2...
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=72c5521d51f4e1601a65d8033e3ced40&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D72c5521d51f4e1601a65d8033e3ced40%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=72c5521d51f4e1601a65d8033e3ced40&userId=adscale-user:2a3143377e1247d790640201e8db12c3
|
44 B
574 B
|
61ms
61ms
|
Image
image/gif |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
setuid
ib.adnxs.com/
Redirect Chain
-
https://tracking.m6r.eu/sync/appnexusRedirect
-
https://ib.adnxs.com/setuid?entity=197&code=72c5521d51f4e1601a65d8033e3ced40
|
43 B
873 B
|
72ms
23ms
|
Image
image/gif |
185.33.223.83
ASN-APPNEX
|
|
|
GET
H/1.1
|
200
OK
|
adxSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=m6r&google_ula=158217889&google_hm=csVSHVH04WAaZdgDPjztQA
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
569 B
|
47ms
47ms
|
Image
image/gif |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H/1.1
|
204
No Content
|
m
ad.yieldlab.net/
Redirect Chain
-
https://tracking.m6r.eu/sync/yieldlabRedirect
-
https://ad.yieldlab.net/m?dt_id=36356&ext_id=72c5521d51f4e1601a65d8033e3ced40
|
0
360 B
|
143ms
49ms
|
Image
text/plain |
2.16.122.151
AKAMAI-ASN1
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
201 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
62ms
62ms
|
Image
image/gif |
23.37.53.21
AKAMAI-AS
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
155ms
48ms
|
Script
text/javascript |
23.210.249.210
AKAMAI-AS
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
98ms
27ms
|
Script
application/javascript |
89.163.159.110
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1 KB
|
290ms
66ms
|
Script
application/javascript |
62.168.44.118
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
84ms
27ms
|
Script
text/javascript |
52.51.174.200
AMAZON-02
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
580 B
|
67ms
29ms
|
Image
image/gif |
35.186.238.175
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
701 B
|
113ms
113ms
|
XHR
application/json |
52.217.37.46
AMAZON-02
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=8729030442
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHhvb1NlaWhvQWNoYWFjaGk9eG9vU2VpaG9BY2hhYWNoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucGZ8fCh3LnBmPTApO3cucGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5wZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZWEoKXtpZighbCl2YyhlYSw1MCk7ZWxzZSBpZighZS53bil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmRsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkdjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uQ2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5FZihjKTtiLmNvKG0pO2IuYm8obCk7Yi5TbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0uemIubGVuZ3RoKXt2YXIgYj1tLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGY7Zj1lLmxvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2ZbIltMT0FEU0NSSVBUXSJdXT1lLkZoLmJpbmQoZSk7d2luZG93W2ZbIltVVElMU10iXV09bTtmb3Iod2luZG93W2ZbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBmIGluIGIpbFtmXT1iW2ZdO3QoYyxhKX07Zj1iLnNjcmlwdHMuc2hpZnQoKTspZS5GaChmLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLkxiPSJzZXR1cCI7dGhpcy5aYz1bXTt0aGlzLkNlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRG4uYmluZCh0aGlzKSk7dGhpcy50Yj17fTt0aGlzLnJoPXt9O3RoaXMuQmY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy50Yil0aGlzLnRiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy50YlthXSsiXyIpO3JldHVybiBifSxrYzpmdW5jdGlvbigpe3RoaXMuQmZ8fCh0aGlzLkJmPWUuWSgxMCkpO3JldHVybiB0aGlzLkJmfSx1YjpmdW5jdGlvbihiKXt0aGlzLnRiW2JdfHwodGhpcy50YltiXT0wKTt0aGlzLnRiW2JdKz0xOzU8dGhpcy50YltiXSYmIXRoaXMucmhbYl0mJih0aGlzLnJoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxDZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxEbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5DbihiLmRhdGEpfSxDbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx3ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5RYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGdoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuT2woYikpcmV0dXJuOyhhPXRoaXMuTmcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxYZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sTW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZmg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sR2Y6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5BbChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9nPWNbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmdsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE5mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LEFoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFllOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZyk7Yz49YSYmKGU9ITApO3JldHVybiBlfSxaZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlllKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlplKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFFiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxSZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSGY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZis9Zy50b1N0cmluZygxNik7cmV0dXJuIGZ9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcD1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO3A9ZTtuPWg7bD16O3k9azt0PW07Zm9yKGc9MDsxOT49ZztnKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZz02MDs3OT49ZztnKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eitsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxwYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGc+PjQsZT0oZyYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZyk/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sSG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxBZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZWM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxwKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1wO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sWGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sdW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sUmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlFpKCl8fApiLlhpKCl8fGIudW0oKXx8Yi5SaigpfHxiLnhrKCl8fGIuRWooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuWmsoKX0sVGw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGYpe2EmJihkLnF1ZXJ5S2V5W2FdPQpmKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHA9Yi5sZW5ndGg7ZzxwOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxnbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LERsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxnLnB1c2goYltwXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocCl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sYWg6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy53aShhKSsiOiIrdGhpcy53aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sd2k6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LERmOmZ1bmN0aW9uKGIpe3RoaXMuTGI9Yn0sWWc6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5MYjt0aGlzLnRlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChwKXt0aGlzLnduPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEpjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5ZZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxwLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtwJiYoeD1rLlNhKHgscCkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtlLkpjKHgpfSxGbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5rYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudGUoYil9LHRlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRm4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0ucGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLkthKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bS5wYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShnLCEwKTtnPW0ud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxiZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPW0ucGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bS53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTttLkthKGQpfX0sZ2Y6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0ubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2YoKX0uYmluZCh0aGlzKSw1MDApfSxOZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMuc2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxRZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sc2I6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5GZChiKToiIn0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5RZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS4kZShiKXx8dGhpcy5NbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnpmJiZ3aW5kb3cuc2FuZGJveC56ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5YZyhiKSlyZXR1cm4gdGhpcy5YZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9CiExfWUudXJsJiZlLmhhc2gmJihlPWEuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUGsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZyxjLGUsaCx4KXt2YXIgaz1lfHxtO2U9ITA7eCYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGUsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxnLGMsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFFjOmZ1bmN0aW9uKGIsYSxkLGcsYyxlLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5RYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuWmMpZm9yKHZhciBjIGluIHRoaXMuWmMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5aY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5iYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlVtKGcuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlpjPWJ9LGtiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuaG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudnA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5HbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnhwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnRnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmxnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5xZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS51Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Eub2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5icD17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkhsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS52ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkdjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Euc2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5sZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Euc2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLklrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5EaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmxuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ybz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLnltfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e1JlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZz1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5EZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkRkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5SZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LEFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuUmUodGhpcy5jbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLApkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5EZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihmKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBmKWdbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBmW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGZbY10pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBmPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZjtyZXR1cm4gZ319KGMsZltjXSk6ZltjXTtmPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zi5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWY7Zi5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGZ9O2MuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1uPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5tbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Xaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLkxhPQp7fTt0aGlzLkc9bnVsbDt0aGlzLlZjPTEwMDt0aGlzLlJiPTA7dGhpcy5WYT0xNTA7dGhpcy5YYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlJiPD10aGlzLlZhPyh0aGlzLlJiKyssdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSk6MD50aGlzLlZhJiYodGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSl9LFhuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmI+dGhpcy5WYT8hMDohMX0seWY6ZnVuY3Rpb24oKXt0aGlzLlJiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxlbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5qYSgpXT1hO0wmJkwuRWgmJkwuQW8oYSl9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIGUuUGUodGhpcy5MYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZjtmb3IoZiBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZl0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX0sR206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx5cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLldqfHxxOyhmdW5jdGlvbihjKXtjLllqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVmM9MTA7dGhpcy5SYj0wO3RoaXMuVmE9NTA7dGhpcy5XPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuS2I9IiI7dGhpcy5QZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZj10aGlzLlRhKCksCmQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZilhLmNvbnRhaW5lcklkPWYuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5XPWF9LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV30saG86ZnVuY3Rpb24oYSl7dGhpcy5rZj1hfSxncTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtmfSxqZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUmI8PXRoaXMuVmEmJih0aGlzLlJiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5WYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxBcTpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5xbSgpfHx0aGlzLkxrKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApqcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sVTpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFhjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxkZjpmdW5jdGlvbigpe3JldHVybiExfSxmaTpmdW5jdGlvbihhKXt0aGlzLktiPWF9LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2J9LCRoOmZ1bmN0aW9uKCl7dGhpcy5LYj1udWxsfSxscTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuS2ImJihhPSEwKTtyZXR1cm4gYX0sdnE6ZnVuY3Rpb24oKXt0aGlzLlBnfHwodGhpcy5QZz0hMCl9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5Zanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmlnPSIxIjt0aGlzLmpnPSIyIjt0aGlzLkVrPSIzIjt0aGlzLmdkPTA7dGhpcy5ibj0zMDt0aGlzLmFjPVtdO3RoaXMubGI9W107dGhpcy52Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy52Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuZ2Q7dGhpcy5pZD1lLlkoMTApO3RoaXMuRWYoYSk7dGhpcy5mbyhiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxlLmdmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx6bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmtjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5rYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV09MX0sRG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZj1uZXcgSTt3aW5kb3dbZi5mYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUua2MoKSYmKHRoaXMuRmYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBmPSEwO2EmJihmPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnptKCk7CmlmKCF0aGlzLkRtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkZmKCk7cmV0dXJufXRoaXMuRmYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxmKTt0aGlzLnNpKCk7dGhpcy52Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5hYy5wdXNoKGEpLHRoaXMubGIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHNpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5hYyYmMDx0aGlzLmFjLmxlbmd0aCYmKHRoaXMuYWM9ZS51bmlxdWUodGhpcy5hYyksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYWMuam9pbigiLCIpKSk7aWYodGhpcy5sYil7Zm9yKHZhciBmPTA7Zjx0aGlzLmxiLmxlbmd0aDtmKyspdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl09PXRoaXMudmNbYV0mJmIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl08CnRoaXMudmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksYT10aGlzLmxiW2ZdLnJlYXNvbik7dGhpcy52Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihmPWUudW5pcXVlKGIpLGE9YSsiLSIrZi5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlnfSxGZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuamd9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Fa30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmdkfSxuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5pZ30sU3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmdkfSxFZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5UcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLnNufHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMudmI9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5XZygpO3RoaXMuS2UoKTt0aGlzLnhsPSExfSxXZzpmdW5jdGlvbigpe3RoaXMudmI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnZiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5LZSgpO2lmKHRoaXMudmIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxLZTpmdW5jdGlvbigpe2lmKCF0aGlzLnZiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMudmI9ITApO3RoaXMuVihiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5XJiYoMCx0aGlzLlcpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmtmJiYoMCx0aGlzLmtmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy56anx8c2E7KGZ1bmN0aW9uKGMpe2MueWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5nZDt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5yZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkViPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGY9MDtmPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2YrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ZdLnRhZyl7dGhpcy5FYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkViPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkViPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuRWI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGY9MDtmPApkLmxlbmd0aDtmKyspYS5vbihkW2ZdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZl0mJih0aGlzLnBlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZl0mJnRoaXMuTGgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuRWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuS2I7YiYmKGIuTGQoKSxiLndkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5oZC5pbmRleE9mKGIpJiZ0aGlzLmhkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5oZC5sZW5ndGg+PXRoaXMucmUmJnRoaXMuaSgpKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5KZT90aGlzLkplKys6dGhpcy5KZT0xOnRoaXMuSWU/CnRoaXMuSWUrKzp0aGlzLkllPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLk5mKGIudmlkZW9UYWcpP2IudmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5wZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSWU+dGhpcy5KZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLldnKCksYi5LZSgpLGIudmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy55anx8dGE7KGZ1bmN0aW9uKGMpe2MuQWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZiYmZigpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGY9MDtmPGIubGVuZ3RoO2YrKylhLnB1c2goYltmXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBmPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpmLnZifHx0aGlzLk0oZil8fHRoaXMuR20oZil8fCh0aGlzLk4oZiksZj1uZXcgdGEoZix0aGlzLkcpLGYuSigpLGYuZigpKX19dGhpcy5QKCl9fSxlcTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUucGIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkZqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWWQoYSl9LmJpbmQodGhpcykpfSxZZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5XJiZ0aGlzLlcoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGYpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGYpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuT2M9dGhpcy5CYT10aGlzLm9kPSExO3RoaXMuVmg9ZS5RYigxMCk7dGhpcy5VZj0hMDt0aGlzLkJjPXRoaXMudmg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksdGhpcy55YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlgsIjsiLHR5cGVvZiBhLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWD9hLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlg/dHlwZW9mIGEuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5JYT9hLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILklhP3R5cGVvZiBhLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5uZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm5lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC54ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlZoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApNYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkxjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saWg6ZnVuY3Rpb24oKXtpZighdGhpcy5PYyl7dmFyIGE9dGhpcy5MYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk9jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5PYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk9jfSxFbTpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLkNtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxDbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2QmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLm9kPSEwKTtyZXR1cm4gdGhpcy5vZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGY9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihmPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe3RoaXMuUG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sUG46ZnVuY3Rpb24oKXt0aGlzLkJjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixmPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihmPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7aWYoZS5EKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO2UuRCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxjcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5MaCgpfS5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuRW0oKSl7dmFyIGI9dGhpcy5MYygpLGY9dGhpcy5NYygpO2ImJmYmJih0aGlzLkJjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudmg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCksYT10aGlzLk1jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZj0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilmPSEwO2Z8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmCmIoZi5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5IY3x8KHRoaXMuSGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkhjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5IYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp3YjpmdW5jdGlvbigpe3JldHVybiBlLkdlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGUuRCgiZ2lnYS5kZSIpfHxlLkQoInNwaWVsZXRpcHBzLmRlIil8fGUuRCgia2luby5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSl0aGlzLlVmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5EKCJnaWdhLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLlFjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuVGwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkdlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlVmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlVmLGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMubXF8fCgxMDx0aGlzLmhwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmhwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuV24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sV246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaXApe3RoaXMuaXA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5ya3x8eWE7KGZ1bmN0aW9uKGMpe2MudGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmppKHdpbmRvdyk7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspdHJ5e2I9Ynx8dGhpcy5qaShhW2ZdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxqaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGUuUGUoYikpe2Zvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihhPW5ldyB4YShiW2ZdKSxhLmdhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy4kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5xZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlYoYSk6dGhpcy5VKCl9LHpuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2IsZj10aGlzLmphKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLm5jJiYoMDw9Zi5pbmRleE9mKGQpfHxiLkxkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5xZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMucWYrKztpZigxMDx0aGlzLnFmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sCllkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgUj1jLlRqfHxSOyhmdW5jdGlvbihjKXtjLlNqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGUpaWYodGhpcy5NYnx8KHRoaXMuTWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5NYisrLDE1PHRoaXMuTWIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5MZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMud2IoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBmPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWY9ITA7Znx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmYihmLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkpsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5KbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS56bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuU2p8fENhOyhmdW5jdGlvbihjKXtjLlVqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZj1uZXcgUihhW2JdKTtmLmdhfHx0aGlzLk0oZil8fCh0aGlzLk4oZiksCihuZXcgQ2EoZix0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVWp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnhtfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5maChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkJuPWEucG9zaXRpb25pbmc7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS53aWR0aD1hLndpZHRoO2Yuc3R5bGUubWluV2lkdGg9CmEud2lkdGg7Zi5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Yuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQm4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGYpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmLGIpfXRoaXMuVChmKTt0aGlzLlYoZik7dGhpcy5CZD1mfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkJkKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtlLkFoKHRoaXMuQmQpOwplLlllKHRoaXMuQmQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxkZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMud2p8fEdhOyhmdW5jdGlvbihjKXtjLnZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLnZqfHxJYTsoZnVuY3Rpb24oYyl7Yy54aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5maChhLCJlbGVtZW50SUQiKTtpZihlLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy54anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuRmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE1rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuJGc9dGhpcy5HaT0hMTt0aGlzLk1oPWQ7dGhpcy5raT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJm0mJm0uYWYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuJGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuamIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmtpP3RoaXMuamIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5qYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5qYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbSYmbS5hZih0aGlzLkZhLnVybCkmJiFiP2UudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTptLmFmKHRoaXMuRmEudXJsKSx0aGlzLk1oJiZ0aGlzLk1oKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5rZT0hMX1jLmJqPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMua2U9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxVbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXtDcDoiQWRDbGlja1RocnUiLEVwOiJBZEVycm9yIixGcDoiQWRTdG9wcGVkIiwKSXA6IkFkTGluZWFyQ2hhbmdlIixKcDoiQWRUYWdQYXJzZWQiLE1wOiJBZFZpZGVvQ29tcGxldGUiLFBwOiJBZExvYWRlZCIsUXA6IkFkU2tpcHBlZCIsUnA6IkFkU3RhcnRlZCIsR3A6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixIcDoiQWRJbXByZXNzaW9uIixEcDoiQWRDcmVhdGl2ZVZpZXciLEtwOiJBZFZpZGVvTWlkcG9pbnQiLExwOiJBZFBhdXNlZCIsTnA6IkFkVmlkZW9TdGFydCIsT3A6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5rZSxhW2RdKX0sVG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmplKWZvcih2YXIgYSBpbiB0aGlzLkdhLmplKXRoaXMuR2EuamUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5qZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMua2UmJnRoaXMuVW4oKTt0aGlzLkdhJiZ0aGlzLlRuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5vYj0iIjt0aGlzLnBkPXRoaXMuZGM9dGhpcy5uYj1udWxsO3RoaXMuU2c9dGhpcy56Yj10aGlzLmNmPSExO3RoaXMuQWE9IiI7dGhpcy5iZj0hMTt0aGlzLnFhPXRoaXMuTmM9IiI7dGhpcy5YZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy53Zj0hMTt0aGlzLmhhPVtdO3RoaXMuVGU9dGhpcy5UYj0iIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuZ2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5CYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy4kYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5VYj0iIjt0aGlzLlZiPVtdO3RoaXMuV2I9W107dGhpcy5hZD1bXTt0aGlzLnNjPSIiO3RoaXMuRmI9ITE7dGhpcy5YZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm1jPSExO3RoaXMuSGc9dGhpcy5iZT1udWxsO3RoaXMuSmY9dGhpcy5oYj10aGlzLlJnPXRoaXMuJGQ9dGhpcy5WZj10aGlzLnJkPXRoaXMud2M9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5HZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5EYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmpkPXRoaXMua2Q9IiI7dGhpcy5rYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5XYz1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsCmFkdGFncGFyYW1ldGVyOnRoaXMub2IsYWR0YWdtb2RpZmllcjp0aGlzLm5iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5kYyxhZHRhZ3JlZ2V4OnRoaXMucGQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuY2Ysc2lkZWxvYWRzOnRoaXMuemIsZGlzYWJsZXRlc3RzOnRoaXMuU2csaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5iZixnbG9iYWxDb25maWc6dGhpcy5OYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuWGUsc2VydmVyOnRoaXMuaGEsc3ZtQ29uZmlnOnRoaXMuVGIsaG9tYWRBZHBhdGg6dGhpcy5UZSxIT01BRF9WRVJJRklFRDp0aGlzLmhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5nZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5CYixIT01BRF9BREJMT0NLRVI6dGhpcy4kYix0ZXN0SGlkZTp0aGlzLlViLHRlc3RUYWdzOnRoaXMuVmIsdGVzdFRhZ3NKUzp0aGlzLldiLAp0ZXN0VGFnc1hIUjp0aGlzLmFkLHRlc3QzUENvb2tpZTp0aGlzLnNjLHRocm90dGxlOnRoaXMuWGQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5tYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMud2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnJkLHVzZVN0cmljdENoZWNrczp0aGlzLlZmLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLiRkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMuQWYsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmFiLHZwYWlkOnRoaXMuaGIsc2tpcEFsbG93ZWQ6dGhpcy5KZix2bWFwczp0aGlzLiRmLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5EYyxhZEZhbGxiYWNrVVJMOnRoaXMua2QsYWRGYWxsYmFja0NvbmZpZzp0aGlzLmpkLHlpZWxkbGFiOnRoaXMua2J9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMub2I9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5uYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLmRjPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMucGQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5jZj1iLmpzcG9wdXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpZGVsb2FkcyYmKHRoaXMuemI9Yi5zaWRlbG9hZHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZGlzYWJsZXRlc3RzJiYodGhpcy5TZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYKKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmJmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLk5jPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNCbG9ja2VkJiYodGhpcy5YZT1iLmlzQmxvY2tlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXImJih0aGlzLmhhPWIuc2VydmVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuVGI9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5UZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5oZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmdlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLkJiPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuJGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJih0aGlzLlViPWIudGVzdEhpZGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3MmJih0aGlzLlZiPWIudGVzdFRhZ3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NKUyYmKHRoaXMuV2I9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYKKHRoaXMuYWQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnNjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5YZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5tYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5IZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkQmxvY2tlckRldGVjdGVkJiYodGhpcy53Yz1iLmFkQmxvY2tlckRldGVjdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnJkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5WZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLiRkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy4kYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMuQWY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYodGhpcy5hYj1iLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudnBhaWQmJih0aGlzLmhiPWIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLkpmPWIuc2tpcEFsbG93ZWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy4kZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkRjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tVUkwpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja0NvbmZpZyYmKHRoaXMuamQ9Yi5hZEZhbGxiYWNrQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnlpZWxkbGFiJiYodGhpcy5rYj1iLnlpZWxkbGFiKX0sb206ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmKGI9ITApO3JldHVybiBifSxDZjpmdW5jdGlvbihiKXt0aGlzLiRhW2JdPSEwfSxZbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxXZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5RYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLiRrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGc9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuJGUoYik7CmM9dGhpcy5hYShiKTtnPyh0aGlzLlBjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMub2J8fHRoaXMubmJ8fHRoaXMuZGN8fHRoaXMucGQpJiYoaD10aGlzLmRuKGgpKTtiPW5ldyBDKGUpO2IudXJsPWU7ZT0iIjtlPWc/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuJGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSwkZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlBjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxQYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5oYSYmdGhpcy5oYS5sZW5ndGgmJjA8dGhpcy5oYS5sZW5ndGgmJihhPXRoaXMuaGFbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sYWY6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy4kZShiKTtyZXR1cm4gYX0sCiRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLllwO3JldHVybiJub25lIn0sSGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYVt0aGlzLkFmXX0scGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhkKCksYT10aGlzLkhmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEloOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZyl7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxjbjpmdW5jdGlvbihiLGEpe3ZhciBkPWUuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPGgubGVuZ3RoO0IrKyl7dmFyIGs9aFtCXS5zcGxpdCgiPSIpO2dba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZ1tsXT10aGlzLkloKGdbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5JaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGRuOmZ1bmN0aW9uKGIpe3RoaXMub2ImJgooYis9dGhpcy5vYik7aWYodGhpcy5uYilmb3IodmFyIGEgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm5iW2FdKSk7dGhpcy5kYyYmKGI9dGhpcy5jbihiLHRoaXMuZGMpKTtyZXR1cm4gYn0scGw6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuamwodGhpcy55YS5jbGllbnRBUElzKX0samw6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE5hO2IucHVibGlzaGVyQVBJJiZhLmtvKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5qbyhiLnBsYXllcik7YS5mKCl9fSxnOmZ1bmN0aW9uKGIsYSxkLGcsYyxlKXttPXRoaXM7dGhpcy5iZj0hMDt0aGlzLk5jPWI7dGhpcy5xYT1hO3RoaXMud2Y9ZDt0aGlzLmJlPWc7dGhpcy5oYz1jO3RoaXMueWE9ZXx8e307dGhpcy5wbCgpO3RoaXMuVG0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5SbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuRmMoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5GYygpfWNhdGNoKGspe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9fSx4YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sVG06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuTmMrdGhpcy52ZSgiZ2xvYmFsIikpLHRoaXMubW0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5GYygpfS5iaW5kKHRoaXMpLCEwKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy52ZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5GYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5DZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sdmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlFiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMucmQpe3RoaXMucmQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGYpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaGM9CiExKTsiZm9jdXMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5oYz0hMSk7dGhpcy5oYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhjP3RoaXMuaGMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlhlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLmdlKSk7dGhpcy5ZYigpO2UuSmMoay54bik7KGE9ZS5VYSh0aGlzLkhkKCkpKXx8KGE9ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbW06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJgooZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5UYnx8dGhpcy5BYXx8dGhpcy5GYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpLHRoaXMuWWIoKSl9fSxGYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExOwp0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGY7KGY9dm9pZCAwPT09YSl8fChmPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5IZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihmKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5EKCJ3ZWIuZGUiKXx8ZS5EKCJnbXgubmV0Iil8fGUuRCgiZ214LmF0Iil8fGUuRCgiZ214LmNoIil8fGUuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlBjKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5laShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuamQ9ZC5hZF9mYWxsYmFja19jb25maWd8fAohMTt0aGlzLlRiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5UZT1kLmFkcGF0aHx8IiI7dGhpcy5BZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlRiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLlJjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKSx0aGlzLlliKCkpfSxlaTpmdW5jdGlvbihiKXt0aGlzLmtkfHwodGhpcy5rZD1ifHwiIil9LFJjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucGMoKSksZD10aGlzLmFhKHRoaXMuVGIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsCiIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuVGIrdGhpcy52ZSgiY3VzdG9tZXIiKSk7dGhpcy5LYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm1jPSEwO3RoaXMuUmMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fApkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuVmY9dGhpcy5nYihkLnN0cmljdCk7dGhpcy4kZD10aGlzLmdiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlJnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5hYj10aGlzLmdiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5nYihkLmVuYWJsZWQpO3RoaXMuVWI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5XYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmFkPWQudGVzdGFkdGFnc3hocnx8CltdO3RoaXMuc2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMub2I9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5kYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucGQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuY2Y9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuaGI7dGhpcy5KZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnNkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy4kZj1kLnZtYXBzfHwiIjt0aGlzLkRjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmVpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5qZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5YZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMua2I9CmQueWllbGRsYWJ8fG51bGw7IXRoaXMubWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1jPSEwLHRoaXMuUmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT28oKSYmKHRoaXMuVWJ8fHRoaXMuV2J8fHRoaXMuVmJ8fHRoaXMuYWQpP3RoaXMud2Y/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLkJiKSksdGhpcy5CZSgpLHRoaXMuWWIoKSk6dGhpcy5HbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlJmKCkpfX0sWG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSksYj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6Yixob21hZF91cmxfc3VmZml4X2Jhc2U2NDplLnBiKGIpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07ZS5RYyh0aGlzLnBjKCksIlBPU1QiLGIsZnVuY3Rpb24oYil7dHJ5e3ZhciBhPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXt9ZS50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghYXx8IWEubGVuZ3RoKSwhMCk7dHJ5e2EmJmEubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlciYmKHRoaXMub2IrPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihhWzBdLmlkKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgYT0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuWSgxMCksaD1lLlkoMTApLEI9ZS5ZKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwpiKEIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKStiKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnBiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUuQWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApOwpyZXR1cm59dGhpcy5zYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sUmY6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKTt0aGlzLlliKCl9LCRjOmZ1bmN0aW9uKGIsYSl7dGhpcy53Yz0hMDt0aGlzLmtiJiYhdGhpcy5IaT8odGhpcy5YbSgpLHRoaXMuSGk9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoYixhKX0uYmluZCh0aGlzKSw1MDApKTp0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIoYikpLHRoaXMuWWIoKSx0aGlzLkJlKCkpfSxGbzpmdW5jdGlvbigpe2lmKHRoaXMuVWIpe3ZhciBiPWUuQWQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkptKCkpdGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7CnRyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVWIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5VYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChnKXt9Yj90aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm5pKCl9fWVsc2UgdGhpcy5uaSgpfSxQZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuUWIoKSksdGhpcy5LbyhnLAowPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLk9mLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLk9mKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5WYj10aGlzLmFkKSYmdGhpcy5WYi5sZW5ndGgpe3ZhciBkPXRoaXMuVmIuc2xpY2UoKSxnPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5PZigpfSxLbzpmdW5jdGlvbihhLGYsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5RYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5QZi5iaW5kKHRoaXMpLGYuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5QZigpfX1mdW5jdGlvbiBmKCl7dGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLldiJiZ0aGlzLldiLmxlbmd0aCl7dmFyIGQ9dGhpcy5XYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlBmKCl9LExvOmZ1bmN0aW9uKGEsZixkKXtmdW5jdGlvbiBnKCl7ZSgpJiZmKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZil7Zj09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sT2Y6ZnVuY3Rpb24oKXtpZih0aGlzLnNjKXRyeXtlLlFjKHRoaXMuc2MsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRmI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5SZigpfS5iaW5kKHRoaXMpLHRoaXMubGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5saSgpfWVsc2UgdGhpcy5SZigpfSxsaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpO3RoaXMuWWIoKTt0aGlzLkJlKCl9LEptOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApZYjpmdW5jdGlvbigpe3ZhciBhPSIwIixmPSIwIjt0cnl7ZS5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLndjJiYoZj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitmLCEwKTsodGhpcy5DYSYmdGhpcy5pc0VuYWJsZWQmJmUuRCgiY2hpcC5kZSIpfHxlLkQoImZvY3VzLmRlIikpJiZ0aGlzLmNsKCk7dGhpcy5zYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkZiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5oZSkpO3RoaXMuYmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5iZSYmdGhpcy5iZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5GYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuV2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5XYy5pZD1lLlkoMTApO3RoaXMuV2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLldjKTt2YXIgYT0KdGhpcy5XYy5jb250ZW50V2luZG93LGY9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Quc3JjPSJodHRwczovL3Vwcy54cGxvc2lvbi5kZS9sb2FkZXIvOTE2MjgvZGVmYXVsdC5qcz94cGxyZGlyPTEiO2EuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKTtmLnNyYz1lLnllKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZS50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sCm9sOmZ1bmN0aW9uKCl7aWYodGhpcy4kZCYmdGhpcy5vbSgpKXt2YXIgYT10aGlzLllsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxzaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZixkLGcsYyxoKXt0aGlzLkdkfHwodGhpcy5HZD0wKTt0aGlzLkdkKys7dGhpcy5HZD50aGlzLnBoJiYhdGhpcy5xaCYmKHRoaXMucWg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLnBoLCEwKSk7YT1uZXcgTWEoYSxmLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpOwpnJiYoYS5HaT0hMCk7YyYmZS5IbSgpJiYoYS4kZz0hMCk7aCYmKGEua2k9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLmFufHwodGhpcy5hbj0hMCxlLkRhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhmPWEucmVzcG9uc2VYTUwpfHwoZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJgpnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlBjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1lLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGYpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLiRmfSxtbDpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hcC5iaW5kKHRoaXMpLHRoaXMuJG8uYmluZCh0aGlzKSl9LGFwOmZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsO3RyeXsoZj1hLnJlc3BvbnNlWE1MKXx8KGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5JbCgpfSwkbzpmdW5jdGlvbigpe30sSWw6ZnVuY3Rpb24oKXtlLkpjKGsuSGwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEJlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09Zi50eXBlJiZlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWYudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LE9vOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGR9LFFiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGY9IiIsZD0wO2Q8YTtkKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGZ9LGdiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PQphfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGY9IiIsZCxnLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZj1mKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspOwpyZXR1cm4gZn0sYWE6ZnVuY3Rpb24oYSl7dmFyIGY9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtmW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixmKXtiJiYoZC5xdWVyeUtleVtiXT1mKX0pO3JldHVybiBkfSxIZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBmKGEpe3ZhciBiPQoiIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsYis9Zi50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWVbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyllW2ddPWQoZVtnLTNdXmVbZy04XV5lW2ctMTRdXmVbZy0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnF8biZyfHEmcikrdStlW2ddKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihmKGgpK2YoaykrZihsKStmKG0pK2YodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnVqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLkJrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZixkKXt0aGlzLmE9CmE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5iaS5iaW5kKHRoaXMpLG11dGU6dGhpcy5sZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEucmI7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5pYz10aGlzLnFkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zjt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5VZD17fTtlLnViKCJuZXdCaWdBZElkIik7dGhpcy5hbD1lLlkoMTApO3RoaXMuTGY9MDt0aGlzLm5kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMubmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMubmQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYKInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVWM9dGhpcy5UZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy51ZT0hMTt0aGlzLnZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubmM9ITE7dGhpcy56bD1lLlkoMTApO3RoaXMuUGI9ZS5ZKDEwKTt0aGlzLk5iPWUuWSgxMCk7dGhpcy5naT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmNlPXRoaXMuWmI9dGhpcy5GZT10aGlzLnhkPXRoaXMuVmQ9dGhpcy5BYj10aGlzLnVjPXRoaXMuUGg9dGhpcy5FZT10aGlzLkNkPXRoaXMuUG89dGhpcy5EYj10aGlzLk9iPSExO3RoaXMuemM9W107dGhpcy5vYz17fTt0aGlzLnRuPTIwMDt0aGlzLmNnPXRoaXMuY2Q9dGhpcy5FYz10aGlzLmJnPXRoaXMudmY9ITE7CnRoaXMubmY9e319Yy5vaj1hO2EucHJvdG90eXBlPXskbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGY9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBmfSx0aTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5MYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMud28oKTtlLm8oay5Kayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmZjpmdW5jdGlvbihhLGYsZCxjKXt0aGlzLkRiPWQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQS5TKXRoaXMuTGYrKyxlLnViKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxjPW0uZ2V0Q29uZmlnKCksZS5HZSYmKHRoaXMuQS5hbyh7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksCmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy50aSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpmLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpmPyh0aGlzLnRpKCksbmV3IFModGhpcyxhLHRoaXMuR2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaGIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB3Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3Yy5mZihhLGYsZCl9LDUwKX19LHJmOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5jZT10aGlzLlpiPXRoaXMuRWU9dGhpcy5DZD0hMTt0aGlzLmI9YTt0aGlzLnFvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLnpjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5VZD10aGlzLmltKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBmPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGY9dGhpcy5iaChiLnBhcmVudCkpLGYucHVzaCh0aGlzLlNsKGIpKSk7CnJldHVybiBmfSxTbDpmdW5jdGlvbihhKXt2YXIgZj0iIixkPVtdO2lmKGEmJmEuTCYmYS5MLmdldEF0dHJpYnV0ZSl7Zj1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmYsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGY9W10sZD1bXSxjPVtdLGU9W10saD0iIjtpZihhLkwpe2Y9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPQowO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKWQucHVzaChhLnNiKGZba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGY9YS5lcnJvci5kZXRhaWwuY29kZSksYS56ZCYmYS56ZC5lcnJvciYmYS56ZC5lcnJvci5jb2RlJiYoZj1hLnpkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZWQuY29kZTpmPT1GLmxlLmNvZGU/ZS5vKGsudnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnUoKSk6KGUuZ2YoKSxmPT1GLmdnLmNvZGUmJmUubyhrLmduLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpO2UubyhrLkdsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54bygpO3RoaXMuV2EoImVtcHR5Iik7dGhpcy5BLkZiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRmIsITApO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLmJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaGcuY29kZTplLm8oay53cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5tZS5jb2RlOmUubyhrLnhwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTsKYnJlYWs7Y2FzZSB2LmllLmNvZGU6ZS5vKGsuaG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB2LmZlLmNvZGU6ZS5vKGsuWW8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB2LmRnLmNvZGU6ZS5vKGsuWm8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMuamMoYSk7dGhpcy5RYSgpfSxqYzpmdW5jdGlvbihhKXt2YXIgZj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZj1hLmVycm9yLmNvZGUsOTAxPGYmJihmPTkwMCkpO2ZvcihmPXsiW0VSUk9SQ09ERV0iOmZ9O2EuT2EubGVuZ3RoOyl0cnl7dmFyIGQ9YS5PYS5wb3AoKTt0aGlzLmVmKGQudXJsLGQudHlwZSxmKX1jYXRjaChjKXt9fSwKcW86ZnVuY3Rpb24oYSl7dGhpcy5GZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuR2YodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihmPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9ZjtmPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2QmJmQuZW52dmFycyYmKGM9ZC5lbnZ2YXJzKCkpO2MudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRWQmJihjPWQuRWQoKSk7Yy52aWRlb1Nsb3QmJihmPWMudmlkZW9TbG90LHRoaXMudmY9ITApfWNhdGNoKGgpe31mLnhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihmLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pOwppZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmYuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuU2smJnRoaXMucGxheWVyLk1lKCkmJihmLnZvbHVtZT10aGlzLnBsYXllci5NZSgpLzEwMCk7Zm9yKDtmLmZpcnN0Q2hpbGQ7KWYucmVtb3ZlQ2hpbGQoZi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZi5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZixhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnZmJiZmLmxvYWQoKTtpZih0aGlzLm9pKGYpKXt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGYpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMudmY/dGhpcy52aWRlbz1mOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChmKX1jYXRjaChsKXt0aGlzLnZpZGVvPWZ9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZiksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxvbzpmdW5jdGlvbigpe3RoaXMuYmc9ITA7CnRoaXMuQWI9dGhpcy51Yz0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5BYj0hMCk7ZS5DZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5vYSYmZS5Sayh0aGlzLmIub3JpZ2luLm9hKTt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlFoKCk7dGhpcy5hLklmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5JZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5HZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy56aSgidnBhaWQiKTsKaWYodGhpcy5BYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlNiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfXRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7CnRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5HZih0aGlzLkYsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkYub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMua2EmJnRoaXMuYS5jLmthKCkmJihhPSEwKTt2YXIgYj10aGlzLmIubG0oKSxjPXRoaXMuYi5zLk9yaWdpbmFsQWRQYXJhbWV0ZXJzO2lmKGImJmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgaD10aGlzLkEuZ2V0Q29uZmlnKCk7aCYmaC5hZEZhbGxiYWNrQ29uZmlnJiZoLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihjPUpTT04uc3RyaW5naWZ5KGguYWRGYWxsYmFja0NvbmZpZykpfXZhciBrPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLAphZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5sYSh0aGlzLkYsImNvbmZpZyIsayk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsCiJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnllKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7ZS53ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5HYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuemM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5qcChhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLmtwKCksdGhpcy5hLmxjKCEwKSwhdGhpcy5aYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5aYj17ZWw6dGhpcy5GLApjYjpmdW5jdGlvbigpe3RoaXMuY2U9ITA7ZS5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuWmUodGhpcy5aYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmxjKCEwKSx0aGlzLm9wKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5sYyghMCksdGhpcy5zcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ycCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnRwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnBwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkVpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5xYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkEuRGN8fHRoaXMuY2QpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5jZCYmKHRoaXMuY2c9ITEsdGhpcy5yYygpKSx0aGlzLm1wKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuQWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlNiKCJtdXRlZCIsInVzZXIiKSxlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5BYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuU2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuVGYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsuc2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7ZS53ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLndlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnhnKGZ1bmN0aW9uKGEpe2UubGEodGhpcy5GLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sbHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnVjPSEwfSxtcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmxkLHRoaXMuYi5zLAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudWM9ITF9LG9wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsudGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuc2csdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5paSgpO2UubyhrLm9nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2UubyhrLmxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuQ2Q9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmxnLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxycDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSx0cDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0scHA6ZnVuY3Rpb24oKXt0aGlzLlhmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sRWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGY9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZik7CmUuQ2UoKTt0aGlzLkY9ITE7dGhpcy5RYShhKX19LGpwOmZ1bmN0aW9uKGEpe3ZhciBmPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWYmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGY9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGYubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTtlLm8oay51cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuRWkoITApfSxOazpmdW5jdGlvbihhLGYpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUGMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChmLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuZ3AuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoZix0aGlzLkEpKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFFrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuWmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sUGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuQmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5aZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5pY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljfHx0aGlzLlpmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWWspKX0sWmY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWQmJnRoaXMub2kodGhpcy52aWRlbykmJiF0aGlzLk9iJiYhdGhpcy5pYyl7dGhpcy5xZD0hMDt0cnl7aWYoIWUuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuT2J8fCh0aGlzLk9iPSEwLHRoaXMuUGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5ZYSgpLCEwKSx0aGlzLkEuUmd8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChmKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLmVwKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuSWYoKTt0aGlzLmNwKCk7dGhpcy56aSgpO3RoaXMuQWcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuTWYoKX19LE1mOmZ1bmN0aW9uKCl7dGhpcy54ZHx8dGhpcy5tZygpfSxtZzpmdW5jdGlvbihhKXt2YXIgZj10aGlzLnZpZGVvLnBsYXkoKTtpZihmJiZmWyJjYXRjaCJdKWZbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnhkfHwoYT90aGlzLlFhKCk6KHRoaXMubGYoITApLHRoaXMubWcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMudWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk1mKCkpfS5iaW5kKHRoaXMpO3RoaXMuT2UoKS5maSh0aGlzKX0sWGY6ZnVuY3Rpb24oKXt0aGlzLkEuYWImJiF0aGlzLk9iJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWGEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5FZT0hMDtlLm8oay5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUWEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBmPVtdLGQ9ITEsYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZS5naChhW2NdKSxmLnB1c2goZCk7YT17aGFzaGVzOmZ9O2E9ay5TYShhLHRoaXMudSgpKTtlLnVvKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5lZSYmdGhpcy5Layh0aGlzLmIuZWUpOwppZighdGhpcy5GZSlpZih0aGlzLkZlPSEwLHRoaXMuY2V8fChlLm8oay5sbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5DYnx8dGhpcy5iLnhjKXtlLnViKCJuZXdTbWFsbEFkSWQiKTt0aGlzLkxmKys7dGhpcy5pYz10aGlzLnFkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGYpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnhpKCl9Y2F0Y2goaCl7fXRoaXMuVmQ9ITA7dGhpcy5hLlNlKCk7dGhpcy5uYz0hMTt0aGlzLk9lKCkuJGgoKTt0aGlzLmIuQ2ImJnRoaXMuYi5vcmlnaW4ubWYoKTt0aGlzLmIueGMmJihhP3RoaXMuYi5vcmlnaW4uSmgoKTp0aGlzLndkKCkpfWVsc2UgdGhpcy53ZCgpfSwKZ3A6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLllmKGEpKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5pYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTt0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxDaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5RYSgpO2Vsc2V7dGhpcy5uYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkdjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5UbyhhKTtpZighdGhpcy5aYil7dmFyIGY9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGY9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlpiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5jZT0hMDtlLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmYscGVyY2VudDpkLHN0YXJ0VGltZTohMX07ZS5aZSh0aGlzLlpiKX1kPSIiO3RoaXMuYi5LZiYmKGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5naSkpJiYoZD10aGlzLmIuS2YtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIiwKZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlRkfHwodGhpcy5UZD0hMCxmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5zZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5DYj8odGhpcy5pYz10aGlzLnFkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmliLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEueGkoKSx0aGlzLmIub3JpZ2luLm1mKCkpOnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxmLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMubmQucmVwbGFjZSgiW3RpbWVdIixlLmFoKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudWU9ITA7CnRoaXMudmlkZW8uY29udHJvbHM9ITF9fSx1aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuQ2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxUbzpmdW5jdGlvbihhKXtlLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudml8fHRoaXMuT2J8fCgwPT1hJiYodGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMuQS5GYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuRmIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy51aSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMudWkoKX0uYmluZCh0aGlzKSksdGhpcy5PYnx8CnRoaXMuaWkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5hYiYmdGhpcy5YYSgic3RhcnQiKSxlLm8oay5vZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGUubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMuQ2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLm8oay5sZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLAplLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy52aT1hKX0saGk6ZnVuY3Rpb24oYSxmKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsZiwhMCl9LHdvOmZ1bmN0aW9uKCl7ZS5iZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxpaTpmdW5jdGlvbigpe2UuYmQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtlLmJkKFsic3RhdHNfaGRfYWRfZW1wdHk6IisKdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2UuYmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuYmd8fHRoaXMuQS5hYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxTYjpmdW5jdGlvbihhLGYpe3RoaXMuQS5hYiYmZS50cmFjaygic3RhdHNfaGRfIithLGYsITApfSx0cmFjazpmdW5jdGlvbihhLGYpe2lmKCF0aGlzLk9iKXt0aGlzLm5mJiZ0aGlzLm5mLnRyYWNrJiZ0aGlzLm5mLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZS5HZSYmZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09CiEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5FYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlVkLmltcHJlc3Npb25zJiZlLkZtKGgudXJsLHRoaXMuVWQuaW1wcmVzc2lvbnMpP3RoaXMuZWYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UubyhrLklrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5lZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZil0cnl7dGhpcy5iLk9hPXRoaXMuQ2wodGhpcy5iLk9hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsCmY9IiI7dGhpcy5iZyYmKGY9Il92cGFpZCIpO3RoaXMuY2QmJihmPSJfd2VsZWN0Iik7cmV0dXJuIGErZn0sZWY6ZnVuY3Rpb24oYSxmLGQsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZj10aGlzLkEud2EoYSksZCYmZi5NayhkKSxjfHwoYz10aGlzLlFnKSxlfHwoZT10aGlzLlFnKSx0aGlzLk9rKGEpLHRoaXMuQS5LYShmLGZ1bmN0aW9uKCl7dGhpcy5aaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlpoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxPazpmdW5jdGlvbihhKXt0aGlzLm9jW2FdPSJvcGVuIn0sWmg6ZnVuY3Rpb24oYSl7dGhpcy5vY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLm9jPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZjtmb3IoZiBpbiB0aGlzLm9jKXRoaXMub2MuaGFzT3duUHJvcGVydHkoZikmJiJvcGVuIj09dGhpcy5vY1tmXSYmYSsrO3JldHVybiBhfSxqbTpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0KZn0pfSxDbDpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Zn0pfSxlcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2Eud2cmJmEud2codGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGUuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMucmMoKTtlbHNlIGlmKHRoaXMuYi5xYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5EZXx8KHRoaXMuYi5EZT0xKTtpZigxMDA+YS10aGlzLmIuRGUpcmV0dXJuO3RoaXMuYi5EZT1hfWNhdGNoKGYpe31lLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQoiX3RvcCI7aWYodGhpcy5BLkRjfHx0aGlzLmNkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnFifWNhdGNoKGYpe2E9d2luZG93Lm9wZW4odGhpcy5iLnFiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX19fS5iaW5kKHRoaXMpLDUwMCl9fSxjcDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5uZC5yZXBsYWNlKCJbdGltZV0iLGUuYWgoMCkpO3ZhciBmPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5zZCYmKGY9dGhpcy5BLnNkKTtmJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhiLmJpbmQodGhpcyksMUUzKmYpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5zZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sClJkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEuc2QpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZS5OZih0aGlzLmNvbnRyb2xzKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuUGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucmkuYmluZCh0aGlzKSksZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5yaS5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnBpLmJpbmQodGhpcykpLGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLk5iO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmdpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLktmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLndpZHRoPSIxMDAlIixmLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixmLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixmLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixmLnN0eWxlLmJvdHRvbT0iMHB4IixmLnN0eWxlLnpJbmRleD0iMTAwMDAiLGYuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGYpO3RoaXMuYS54ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5sZigpKTt0aGlzLkliKCl9fSxJYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHJjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmNnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpKX0scmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnVjPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudWM9ITEpOihlLmxhKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy51Yz0hMCl9LExkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuU2IoIm11dGVkIiwidXNlciIpLGUubyhrLkpkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpOwp0aGlzLkFiPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5TYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxxYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYyk7dGhpcy54ZHx8dGhpcy51ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTWYoKSl9LHdkOmZ1bmN0aW9uKCl7dGhpcy5PbSgpJiZ0aGlzLk5tKCkmJih0aGlzLkEud2N8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuTGImJnRoaXMuVW8oKXx8KHRoaXMueGQ9ITAsdGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy5MZygpKX0sT206ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCk7aWYoIXRoaXMuQS5oYnx8ZS5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGY9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuRGEoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZitkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuVWN8fChhPQohMCxmLmFkRmFsbGJhY2tVUkx8fChmLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkVjJiZmLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5VY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRWM/ImFueSI6IiIpKyhmLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5VYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRWMmJmYuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlVjfSxabDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxmPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1mLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmYuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1lLnllKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5mZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy53ZCgpfXZhciBmPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWmwoKTt0aGlzLkVjPXRoaXMuVWM9dGhpcy5jZD10aGlzLmNnPSEwO3JldHVybiBmPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2YsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy50bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlNlKCksdGhpcy5hLlluKCksdGhpcy5uYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkVlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5PZSgpLiRoKCkpfSxPZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxBZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLlllKHRoaXMudmlkZW8sYSk/dGhpcy5iaSgpOnRoaXMuTGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5xYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5DYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy56YyYmMDx0aGlzLnpjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy56YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5hbCsiLSIrdGhpcy5MZjt0aGlzLmImJnRoaXMuYi5oaCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuaGgoKSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5sa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtmPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlg9W107dGhpcy5MPW51bGw7dGhpcy55Yz10aGlzLkFjPSExO3RoaXMub2E9IiI7dGhpcy5hZz0hMTt0aGlzLnNoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGYsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZj1mdW5jdGlvbigpe3JldHVybiBjKCkmJihlLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRCgiZmFuZG9tLmNvbSIpfHxlLkQoImdpZ2EuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGMoKXx8ZigpKXt2YXIgaD1lLk5nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGY9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuRCgiZ2lnYS5kZSIpfHxlLkQoImtpbm8uZGUiKXx8ZS5EKCJzcGllbGV0aXBwcy5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZigpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1kKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLldkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5LYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxkaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkxiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChmKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5MYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuTGJ8fHRoaXMuTG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0uRW8oKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sTG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2M9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksYz1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkduKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLnNoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWC5sZW5ndGgpdGhpcy5UYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuZWQse2Vycm9yOnRoaXMuYWc/Ri5sZTpGLmZnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGQpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLlgubGVuZ3RoP3RoaXMuVGMoKTp0aGlzLnJhKHRoaXMuUmEodi5lZCx7ZXJyb3I6dGhpcy5hZz9GLmxlOkYuZmd9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuZWcse2RlcHRoOmJ9KSl9LFRjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWC5zaGlmdCgpO3RoaXMuUG0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubWgoKSxmLHtBZFN5c3RlbTp0aGlzLlJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmhnKSk6KGI9MCx0aGlzLldvKCkmJnRoaXMucmYodGhpcy5CbCgpKSl9LG1mOmZ1bmN0aW9uKCl7dGhpcy5BYz8odGhpcy5BYz0xPHRoaXMuWC5sZW5ndGgsCnRoaXMuWC5sZW5ndGgmJnRoaXMuVGMoKSk6dGhpcy5wYXJlbnQubWYoKX0sSmg6ZnVuY3Rpb24oKXt0aGlzLnljPyh0aGlzLnljPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLlRjKCkpOnRoaXMucGFyZW50LkpoKCl9LFdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLktjKCk/dGhpcy5yYSh0aGlzLlJhKHYuZmUpKTp0aGlzLnJhKHRoaXMuUmEodi5kZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuZWQsRi5nZykpLCExKX0scmY6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuZWV8fChhLmVlPVtdKTthLmVlLnB1c2godGhpcy5zaCk7YS5PYT1hLk9hLmNvbmNhdCh0aGlzLmhmKCkpO2EuQ2I9YS5DYj9hLkNiOnRoaXMuQWM7YS54Yz1hLnhjP2EueGM6dGhpcy55YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWmc7dGhpcy5wYXJlbnQucmYoYSl9LApCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLktjKCk7YS5PPXRoaXMuamgoKTthLnFiPXRoaXMuVWwoKTthLkVxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUWwoKTthLktmPXRoaXMuaG0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpkLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGMpe319dGhpcy5MJiYoYS5PYT1hLmVycm9yLmNvZGUhPXYuZmUuY29kZT9hLk9hLmNvbmNhdCh0aGlzLlZsKCkpOmEuT2EuY29uY2F0KHRoaXMuZG0oKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5qYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmpjJiZ0aGlzLnBhcmVudC5qYyhhKSxiPTAsdGhpcy5UYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGpjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmpjKGEpfSxUZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxNbzpmdW5jdGlvbigpe3JldHVybiBiPApmfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuamgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5LYygpfSxRZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LG1pOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5RZigpJiYoYT0hMCk7cmV0dXJuIGF9LEduOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5hZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxQbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLm1oKCkubGVuZ3RofSxtaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5lKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFJsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmUodGhpcy5MLCJBZFN5c3RlbSIpfSxoZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1jJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fAphLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnpoKGEpKXt2YXIgZj1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Yy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpmLHVybDp0aGlzLnNiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxWbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmpoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFpwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnNiKGFbZF0pfSk7dmFyIGM9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGI9Zi5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxRbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixkPSExLGM9W10sYj0hMSxmPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Y9Yj10aGlzLkZkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWMucHVzaChkKTtlLnB1c2goZil9MTxhLmxlbmd0aD8oYj1jLGg9Zik6KGI9ZCxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxLYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnNiKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGhtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsYz0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGM9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUudG8oYyxhKSwwPmImJihiPSExKX1jYXRjaChmKXtiPSExfXJldHVybiBifSxOZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuc2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxzYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkZkKGEpOiIifSxGZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5RZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5QaXx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk89W107dGhpcy5xYj0iIjt0aGlzLnM9dGhpcy54Yz10aGlzLkNiPSExO3RoaXMuVWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlZlPSIifWMuVmo9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5PLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sYm06ZnVuY3Rpb24oKXtpZighdGhpcy5VZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm5hKXt2YXIgYT10aGlzLm9yaWdpbi5uYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5VZT1hW2RdKX1yZXR1cm4gdGhpcy5VZX0saGg6ZnVuY3Rpb24oKXtpZih0aGlzLlZlKXJldHVybiB0aGlzLlZlO3ZhciBhPSIiOyhhPXRoaXMuYm0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlZlPWF9LGxtOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2NdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Wanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5PaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXttZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixOYToiWE1MX1BBUlNFX0VSUk9SIn0sZGc6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGVkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGhnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApOYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTmE6IkxPQURfRVJST1IifSxpZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKenA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTmE6Ik1FRElBRklMRV9FUlJPUiJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE5hOiJEVU1NWV9BRCJ9fSxGPXtmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE5hOiJOT19BRFMifSxnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTmE6Ik5PX01FRElBRklMRVMifSxBcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGxlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Laj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBXYT1jLktqfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnpkPWM7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmRqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLk5sfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuYWk9YTt0aGlzLnZpZGVvPWM7dGhpcy5hZT1bXTt0aGlzLlloPVtdO3RoaXMub2Y9W107dGhpcy5mcD0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLkJwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYWkubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5haVthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLnRxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Wbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Nbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuYWUucHVzaCh7c3JjOmQsZnJhbWU6aCx2bjplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5vZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLm9mW2NdO2QudHlwZT09PWEmJmQuZmwodGhpcy5XbChhKSl9fSwKV2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7Q3E6ITAsQnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7cXE6InZpZGVvIixGcToianNDdXN0b20iLEdxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsSHE6MSwkcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LAprbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuYWUubGVuZ3RoO2MrKylpZih0aGlzLmFlW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYWVbY10udm47cmV0dXJuIiJ9LFZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5ZaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5rbShjKSx2ZW5kb3I6Y30pO3RoaXMudm8oKX0sTW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLmZwLm1hcChmdW5jdGlvbihhKXt0aGlzLnlnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMueWcoYSxjKX0seWc6ZnVuY3Rpb24oYSxjKXt0aGlzLm9mLnB1c2goe3R5cGU6YSxmbDpjLHpxOiExfSl9LHZvOmZ1bmN0aW9uKCl7dGhpcy5ZaC5tYXAoZnVuY3Rpb24oYSl7YS5JbXx8KGEuc3Eoe2FkU2Vzc2lvbklkOmUuWSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuRHEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5JbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLlhrfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLnJiPWEuZWgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWSgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy56Zz0hMTsKdGhpcy5lYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxDbzpmdW5jdGlvbigpe3RoaXMuemc9ITB9LHhpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkdjLHRoaXMuYy5sKCkpfSxZbjpmdW5jdGlvbigpe3RoaXMuemd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay52ZCx0aGlzLmMubCgpKSl9LElmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnJiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5yYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLnJiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMucmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5yYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5yYik7CnRoaXMuYy5YYyYmdGhpcy5jLlhjKCk/dGhpcy5jLmVoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sc206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGxjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5yYik7aWYoYy54IT10aGlzLkhhLnh8fGMueSE9dGhpcy5IYS55fHxjLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLkhhLndpZHRofHxjLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuU2UoKTtyZXR1cm59dGhpcy5IYT1jO3RoaXMuYy5YYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmVjLmxlbmd0aDthKyspdGhpcy5lY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLk5mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGMuYmluZCh0aGlzKSwxMCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLmVjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5lYy5wdXNoKGEpfSxTZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ybj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMucm58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5PZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sT2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGJiPWMuUGp8fGJiOyhmdW5jdGlvbihjKXtjLk9qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuYmM9dGhpcy5iY3x8ITE7dGhpcy5wZz10aGlzLnJnPQp0aGlzLndoPXRoaXMudmE9dGhpcy5TZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5TZj0hMDt0aGlzLndoJiZ0aGlzLkdnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuS2I7YSYmYS5uYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpOwp0aGlzLkNnKCl9LEdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmMpe3RoaXMudGQoKTtpZighdGhpcy5TZiYmIXRoaXMudGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlNmJiZ0aGlzLnBnJiYhdGhpcy5yZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19LHRkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxraDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxDZzpmdW5jdGlvbigpe2lmKHRoaXMudGQoKSl7dmFyIGE9CnRoaXMua2goImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5yZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnBnPWEuWHB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2coKX0uYmluZCh0aGlzKSwxMDApfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5vcSgpOiExfSxLYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuS2MoKTotMX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sS2w6ZnVuY3Rpb24oYSxiKXt0aGlzLmJjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLmJjfHwzMDI9PXRoaXMuYmM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuYmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuV2UoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5lbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBjYj1jLk9qfHxjYjsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEttOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlpqLkZrLkRrP3dpbmRvdy5PTy5aai5Gay5Eay5WcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5QZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGNiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlFqfHxkYixlYj1uZXcgZGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5FbHx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5uaCgpfSxuaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE1hOmZ1bmN0aW9uKCl7dGhpcy5UaCgpfSxUaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVml8fGdiOyhmdW5jdGlvbihjKXtjLlVpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRGcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlVpfHxoYjsoZnVuY3Rpb24oYyl7Yy5XaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFdoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLldoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5XaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLldpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLldrfHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5paz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxYYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuaWt8fFU7KGZ1bmN0aW9uKGMpe2MuaGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5tZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp3Lm1kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubm4oYSl9LmJpbmQodGhpcykpO3cubWQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5tZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0sbm46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5pYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLktkJiYoYT1lLkRsKGEsdGhpcy5LZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk0oZCkpe3RoaXMuTihkKTsKdmFyIGc9bmV3IFYoZCx0aGlzLkcpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLktkfHwodGhpcy5LZD1bXSksdGhpcy5LZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGc9bmV3IFYoZCx0aGlzLkcpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbWQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0sTm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5TY3x8Cih0aGlzLlNjPVtdKSx0aGlzLlNjLnB1c2goYSksdGhpcy5YbigpJiYodGhpcy55ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuU2MpZm9yKHZhciBhPTA7YTx0aGlzLlNjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuU2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5ObyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Tbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMuU298fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5SaXx8bWI7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuU2l8fApuYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuTShoKXx8KHRoaXMuTihoKSwobmV3IG5iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlRpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5ra3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLkljPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9CiEwKTt2YXIgYj10aGlzLlZnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5JYz1iKTtpZighdGhpcy5JZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRWQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVihiKTt0aGlzLkxuKHRoaXMuZ2V0UmF3UGxheWVyKCksCmEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHdnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTt0aGlzLmdjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5nYyYmdGhpcy5nYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdHJ5e3RoaXMuZ2NbYV0oKX1jYXRjaChiKXt9fSxFZDpmdW5jdGlvbigpe2lmKHRoaXMuSWMpcmV0dXJuIHRoaXMuSWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVmcoYSkpcmV0dXJuIHRoaXMuSWM9YX19LFZnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxMbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCwKZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS51bm11dGUmJgp0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0seGg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Nanx8cmI7KGZ1bmN0aW9uKGMpe2MuTGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5FZCgpP3RoaXMuQygpOih0aGlzLkhlfHwodGhpcy5IZT0xKSx0aGlzLkhlKyssMTAwPHRoaXMuSGU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Manx8c2I7KGZ1bmN0aW9uKGMpe2MuTmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyBzYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Oanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy5ranx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sCk1hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudmt8fHZiOyhmdW5jdGlvbihjKXtjLnVrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxKbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPQpbXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5CYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkpuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuTWMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7CnJldHVybn1pZighdGhpcy5CYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudWt8fHdiOyhmdW5jdGlvbihjKXtjLndrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTsKdGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgd2IoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMud2t8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLndtfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5zZj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTAwKX0sQW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5XJiZ0aGlzLlcoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx5bzpmdW5jdGlvbigpe3RoaXMuc2Y9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudGM9MH0sZjpmdW5jdGlvbigpe3RoaXMuJG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnRjfHwodGhpcy50Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy50Y3x8dGhpcy50YysrLHRoaXMudGM8PXRoaXMuJG0/KHRoaXMudGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnlvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQmI9Yy5ja3x8QmI7KGZ1bmN0aW9uKGMpe2MuZWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkcpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy55cHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5HYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUW0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm5nKCl8fHRoaXMuaSghMCl9LFFtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HYigpOyFhLnBhJiZhLlgmJmEuVXAmJmEuV3AmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2IoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZmQuR2IoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXS5pZD09YiYmKHRoaXMuTmg9YVtmXSk7cmV0dXJuIHRoaXMuTmh9LHBxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5HYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5mZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmZkLkdiKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmZkLkdiPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5mZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5wbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMucG58fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVihiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxucTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApYYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Ianx8WDsoZnVuY3Rpb24oYyl7Yy5Haj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnRmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMudGYmJmMhPXRoaXMudGZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuRCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEudXEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkdqfHxZOyhmdW5jdGlvbihjKXtjLklqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy55ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLklqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLk5pfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlYoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sZGk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGtuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0sQWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5BZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE9iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMudW58fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLllpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVihiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxkaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxrbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLllpfHxTYjsoZnVuY3Rpb24oYyl7Yy5aaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkFlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWml8fFRiOyhmdW5jdGlvbihjKXtjLiRpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgU2IoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBUYihjLHRoaXMuRykpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuJGl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLnFufHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlYoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxLbjpmdW5jdGlvbigpe3RoaXMuZGQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5kZHx8KHRoaXMuZGQ9ITAsdGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZGQmJih0aGlzLlpkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZGQ9ITEpLHRoaXMuWmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLnprfHxYYjsoZnVuY3Rpb24oYyl7Yy55az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmZjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5mYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGguYmluZCh0aGlzKSwxMCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuR2s9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkdrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxrZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5mYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2cuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5YaCgpO3RoaXMua2coKTt0aGlzLk5uKCl9LE5uOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuSG4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuSG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5mYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy55a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5LbigpLGE9bmV3IFliKGEsCnRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkFrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuVGt8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm5rPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZW49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGRpOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZZChhKX0uYmluZCh0aGlzKSl9LFlkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBOPWMubmt8fE47KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5MZSlpZih0aGlzLk1ifHwodGhpcy5NYj0wKSx0aGlzLk1iKyssMTU8dGhpcy5NYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5tbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLndiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5ta3x8TzsoZnVuY3Rpb24oYyl7Yy5vaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnlmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5va3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMueW58fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkNqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5WKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuQ2p8fFo7KGZ1bmN0aW9uKGMpe2MuQmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5PYz10aGlzLkJhPXRoaXMub2Q9ITE7dGhpcy5WaD1lLlFiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2IoKT8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkJqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Eaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkRqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy52bXx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVihiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5panx8aGM7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5oanx8aWM7KGZ1bmN0aW9uKGMpe2Muamo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmdhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmpqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Wa3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuemUoKTt0aGlzLkJnKCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemUuYmluZCh0aGlzKSwxMDApfSx6ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnplLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlVrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuTWQ9W107dGhpcy54Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5mbShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmNpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy54Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMueGZbZF07dGhpcy5XZihjKSYmKHRoaXMuTWQucHVzaChjKSx0aGlzLmNpKGMpKX19LFdmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0sZm06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMueGZbZF0sdGhpcy5XZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxjaTpmdW5jdGlvbihhKXt0aGlzLldmKGEpJiZhLmYoKX0sQW86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuTWQubGVuZ3RoO2ErKyl0aGlzLk1kW2FdLlhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTWRbYV0uWGIpfX19KShjKTt2YXIgcmM9CmMuWGp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuSmp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZS5KYyhrLlhvKSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5KYyhrLmpuKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHhjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksdmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbD0hMTtILmZhKCk7SC55aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnloKCksCmZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmEoKTt2YXIgeWM9eGMoZnVuY3Rpb24oKXtlLllnKHdpbmRvdyxILkFtKCkse2lkOnljfSl9LDUwMCksaWE9ZS5ZKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Daz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuQ2t8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5TaD10aGlzLmNvbmY9dGhpcy5KYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSWQ9MDt0aGlzLmViPSIiO3RoaXMuTmQ9W107dGhpcy5PZD0wO3RoaXMuVWg9ITE7dGhpcy51Zj1bXTtlLnViKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtpbzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPQphO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGNvOmZ1bmN0aW9uKGEpe3RoaXMuSmI9YX0sYm86ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gY30sWWM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuQm0oKSl0aGlzLkpiLmcodGhpcy5KYi5OYyx0aGlzLkpiLnFhLHRoaXMuSmIud2YsZnVuY3Rpb24oKXt0aGlzLlljKGEsYyl9LmJpbmQodGhpcyksdGhpcy5KYi5oYyk7ZWxzZSBpZih0aGlzLnBtKCkpdGhpcy5abihmdW5jdGlvbigpe3RoaXMuWWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkdjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLGw9Cm5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuQ28oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS51YigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBRYShsLHRoaXMuSmIsaCk7bC4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWm0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5kZiYmKGQ9dGhpcy5wbGF5ZXIuZGYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZmYoYSxkLGcpO3RoaXMucGxheWVyLmZpKGwpfX0sQm06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5JZClyZXR1cm4gYz1hLmdldFRpbWUoKS0KdGhpcy5JZC5nZXRUaW1lKCksdGhpcy5JZD1hLDNFNTxjPyEwOiExO3RoaXMuSWQ9YTtyZXR1cm4hMX0sc286ZnVuY3Rpb24oKXtlLnViKCJwcmVyb2xsIik7ZS5EZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlVnKGEpKT90aGlzLlljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlNoKXtlLkRmKCJwb3N0cm9sbCIpO2UudWIoInBvc3Ryb2xsIik7dGhpcy5pbyghMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7CihkPXRoaXMuVWcoZCkpP3RoaXMuWWMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9fSxVZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sUm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbyh0aGlzLnJvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk1hKCl9LFNkOmZ1bmN0aW9uKGEpe2UudWIoIm1pZHJvbGwiKTtlLkRmKCJtaWRyb2xsIik7aWYoIXRoaXMuSGgpe3RoaXMuSGg9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuWWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGg9CiExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnZkLHRoaXMucGxheWVyLmwoKSkpfX0sUW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmpmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLnNvKCk7dGhpcy5wbGF5ZXIuamYmJnRoaXMuUW4oKTt0aGlzLlJuKCl9LFNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGYpe3RoaXMuTmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmtiKGEsYixjLGYsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsCmFbY10ubWFjcm8pfXRoaXMuT2Q9dGhpcy5OZC5sZW5ndGh9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLk9kJiYoYT0hMCk7cmV0dXJuIGF9LFpuOmZ1bmN0aW9uKGEpe3RoaXMuVWg9YTtmb3IoYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fbi5iaW5kKHRoaXMpKX0sRW46ZnVuY3Rpb24oYSl7dGhpcy5PZC0tO2EmJnRoaXMudWYucHVzaChhKTswPj10aGlzLk9kJiZ0aGlzLlVoKCl9LFptOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLnVmLmxlbmd0aDtkKyspYz10aGlzLnVmW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLkxpfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucGt8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoeG9vU2VpaG9BY2hhYWNoaSx4b29TZWlob0FjaGFhY2hpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.217.37.46
Ashburn, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- s3-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H/1.1
|
200
OK
|
rmp-hcjson.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
291 B
663 B
|
15ms
15ms
|
XHR
application/json |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
General
- Full URL
- https://video.golem.de/staticrl/scripts/radiant/rmp-hcjson.php?cache=6540456283
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHhvb1NlaWhvQWNoYWFjaGk9eG9vU2VpaG9BY2hhYWNoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucGZ8fCh3LnBmPTApO3cucGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5wZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZWEoKXtpZighbCl2YyhlYSw1MCk7ZWxzZSBpZighZS53bil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmRsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkdjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uQ2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5FZihjKTtiLmNvKG0pO2IuYm8obCk7Yi5TbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0uemIubGVuZ3RoKXt2YXIgYj1tLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGY7Zj1lLmxvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2ZbIltMT0FEU0NSSVBUXSJdXT1lLkZoLmJpbmQoZSk7d2luZG93W2ZbIltVVElMU10iXV09bTtmb3Iod2luZG93W2ZbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBmIGluIGIpbFtmXT1iW2ZdO3QoYyxhKX07Zj1iLnNjcmlwdHMuc2hpZnQoKTspZS5GaChmLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLkxiPSJzZXR1cCI7dGhpcy5aYz1bXTt0aGlzLkNlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRG4uYmluZCh0aGlzKSk7dGhpcy50Yj17fTt0aGlzLnJoPXt9O3RoaXMuQmY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy50Yil0aGlzLnRiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy50YlthXSsiXyIpO3JldHVybiBifSxrYzpmdW5jdGlvbigpe3RoaXMuQmZ8fCh0aGlzLkJmPWUuWSgxMCkpO3JldHVybiB0aGlzLkJmfSx1YjpmdW5jdGlvbihiKXt0aGlzLnRiW2JdfHwodGhpcy50YltiXT0wKTt0aGlzLnRiW2JdKz0xOzU8dGhpcy50YltiXSYmIXRoaXMucmhbYl0mJih0aGlzLnJoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxDZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxEbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5DbihiLmRhdGEpfSxDbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx3ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5RYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGdoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuT2woYikpcmV0dXJuOyhhPXRoaXMuTmcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxYZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sTW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZmg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sR2Y6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5BbChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9nPWNbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmdsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE5mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LEFoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFllOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZyk7Yz49YSYmKGU9ITApO3JldHVybiBlfSxaZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlllKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlplKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFFiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxSZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSGY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZis9Zy50b1N0cmluZygxNik7cmV0dXJuIGZ9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcD1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO3A9ZTtuPWg7bD16O3k9azt0PW07Zm9yKGc9MDsxOT49ZztnKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZz02MDs3OT49ZztnKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eitsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxwYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGc+PjQsZT0oZyYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZyk/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sSG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxBZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZWM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxwKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1wO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sWGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sdW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sUmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlFpKCl8fApiLlhpKCl8fGIudW0oKXx8Yi5SaigpfHxiLnhrKCl8fGIuRWooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuWmsoKX0sVGw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGYpe2EmJihkLnF1ZXJ5S2V5W2FdPQpmKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHA9Yi5sZW5ndGg7ZzxwOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxnbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LERsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxnLnB1c2goYltwXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocCl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sYWg6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy53aShhKSsiOiIrdGhpcy53aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sd2k6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LERmOmZ1bmN0aW9uKGIpe3RoaXMuTGI9Yn0sWWc6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5MYjt0aGlzLnRlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChwKXt0aGlzLnduPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEpjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5ZZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxwLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtwJiYoeD1rLlNhKHgscCkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtlLkpjKHgpfSxGbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5rYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudGUoYil9LHRlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRm4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0ucGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLkthKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bS5wYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShnLCEwKTtnPW0ud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxiZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPW0ucGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bS53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTttLkthKGQpfX0sZ2Y6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0ubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2YoKX0uYmluZCh0aGlzKSw1MDApfSxOZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMuc2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxRZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sc2I6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5GZChiKToiIn0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5RZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS4kZShiKXx8dGhpcy5NbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnpmJiZ3aW5kb3cuc2FuZGJveC56ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5YZyhiKSlyZXR1cm4gdGhpcy5YZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9CiExfWUudXJsJiZlLmhhc2gmJihlPWEuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUGsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZyxjLGUsaCx4KXt2YXIgaz1lfHxtO2U9ITA7eCYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGUsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxnLGMsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFFjOmZ1bmN0aW9uKGIsYSxkLGcsYyxlLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5RYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuWmMpZm9yKHZhciBjIGluIHRoaXMuWmMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5aY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5iYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlVtKGcuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlpjPWJ9LGtiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuaG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudnA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5HbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnhwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnRnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmxnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5xZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS51Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Eub2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5icD17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkhsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS52ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkdjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Euc2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5sZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Euc2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLklrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5EaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmxuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ybz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLnltfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e1JlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZz1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5EZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkRkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5SZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LEFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuUmUodGhpcy5jbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLApkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5EZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihmKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBmKWdbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBmW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGZbY10pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBmPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZjtyZXR1cm4gZ319KGMsZltjXSk6ZltjXTtmPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zi5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWY7Zi5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGZ9O2MuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1uPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5tbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Xaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLkxhPQp7fTt0aGlzLkc9bnVsbDt0aGlzLlZjPTEwMDt0aGlzLlJiPTA7dGhpcy5WYT0xNTA7dGhpcy5YYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlJiPD10aGlzLlZhPyh0aGlzLlJiKyssdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSk6MD50aGlzLlZhJiYodGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSl9LFhuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmI+dGhpcy5WYT8hMDohMX0seWY6ZnVuY3Rpb24oKXt0aGlzLlJiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxlbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5qYSgpXT1hO0wmJkwuRWgmJkwuQW8oYSl9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIGUuUGUodGhpcy5MYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZjtmb3IoZiBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZl0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX0sR206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx5cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLldqfHxxOyhmdW5jdGlvbihjKXtjLllqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVmM9MTA7dGhpcy5SYj0wO3RoaXMuVmE9NTA7dGhpcy5XPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuS2I9IiI7dGhpcy5QZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZj10aGlzLlRhKCksCmQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZilhLmNvbnRhaW5lcklkPWYuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5XPWF9LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV30saG86ZnVuY3Rpb24oYSl7dGhpcy5rZj1hfSxncTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtmfSxqZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUmI8PXRoaXMuVmEmJih0aGlzLlJiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5WYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxBcTpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5xbSgpfHx0aGlzLkxrKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApqcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sVTpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFhjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxkZjpmdW5jdGlvbigpe3JldHVybiExfSxmaTpmdW5jdGlvbihhKXt0aGlzLktiPWF9LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2J9LCRoOmZ1bmN0aW9uKCl7dGhpcy5LYj1udWxsfSxscTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuS2ImJihhPSEwKTtyZXR1cm4gYX0sdnE6ZnVuY3Rpb24oKXt0aGlzLlBnfHwodGhpcy5QZz0hMCl9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5Zanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmlnPSIxIjt0aGlzLmpnPSIyIjt0aGlzLkVrPSIzIjt0aGlzLmdkPTA7dGhpcy5ibj0zMDt0aGlzLmFjPVtdO3RoaXMubGI9W107dGhpcy52Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy52Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuZ2Q7dGhpcy5pZD1lLlkoMTApO3RoaXMuRWYoYSk7dGhpcy5mbyhiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxlLmdmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx6bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmtjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5rYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV09MX0sRG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZj1uZXcgSTt3aW5kb3dbZi5mYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUua2MoKSYmKHRoaXMuRmYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBmPSEwO2EmJihmPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnptKCk7CmlmKCF0aGlzLkRtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkZmKCk7cmV0dXJufXRoaXMuRmYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxmKTt0aGlzLnNpKCk7dGhpcy52Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5hYy5wdXNoKGEpLHRoaXMubGIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHNpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5hYyYmMDx0aGlzLmFjLmxlbmd0aCYmKHRoaXMuYWM9ZS51bmlxdWUodGhpcy5hYyksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYWMuam9pbigiLCIpKSk7aWYodGhpcy5sYil7Zm9yKHZhciBmPTA7Zjx0aGlzLmxiLmxlbmd0aDtmKyspdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl09PXRoaXMudmNbYV0mJmIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl08CnRoaXMudmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksYT10aGlzLmxiW2ZdLnJlYXNvbik7dGhpcy52Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihmPWUudW5pcXVlKGIpLGE9YSsiLSIrZi5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlnfSxGZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuamd9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Fa30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmdkfSxuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5pZ30sU3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmdkfSxFZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5UcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLnNufHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMudmI9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5XZygpO3RoaXMuS2UoKTt0aGlzLnhsPSExfSxXZzpmdW5jdGlvbigpe3RoaXMudmI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnZiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5LZSgpO2lmKHRoaXMudmIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxLZTpmdW5jdGlvbigpe2lmKCF0aGlzLnZiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMudmI9ITApO3RoaXMuVihiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5XJiYoMCx0aGlzLlcpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmtmJiYoMCx0aGlzLmtmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy56anx8c2E7KGZ1bmN0aW9uKGMpe2MueWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5nZDt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5yZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkViPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGY9MDtmPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2YrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ZdLnRhZyl7dGhpcy5FYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkViPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkViPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuRWI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGY9MDtmPApkLmxlbmd0aDtmKyspYS5vbihkW2ZdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZl0mJih0aGlzLnBlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZl0mJnRoaXMuTGgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuRWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuS2I7YiYmKGIuTGQoKSxiLndkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5oZC5pbmRleE9mKGIpJiZ0aGlzLmhkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5oZC5sZW5ndGg+PXRoaXMucmUmJnRoaXMuaSgpKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5KZT90aGlzLkplKys6dGhpcy5KZT0xOnRoaXMuSWU/CnRoaXMuSWUrKzp0aGlzLkllPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLk5mKGIudmlkZW9UYWcpP2IudmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5wZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSWU+dGhpcy5KZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLldnKCksYi5LZSgpLGIudmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy55anx8dGE7KGZ1bmN0aW9uKGMpe2MuQWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZiYmZigpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGY9MDtmPGIubGVuZ3RoO2YrKylhLnB1c2goYltmXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBmPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpmLnZifHx0aGlzLk0oZil8fHRoaXMuR20oZil8fCh0aGlzLk4oZiksZj1uZXcgdGEoZix0aGlzLkcpLGYuSigpLGYuZigpKX19dGhpcy5QKCl9fSxlcTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUucGIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkZqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWWQoYSl9LmJpbmQodGhpcykpfSxZZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5XJiZ0aGlzLlcoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGYpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGYpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuT2M9dGhpcy5CYT10aGlzLm9kPSExO3RoaXMuVmg9ZS5RYigxMCk7dGhpcy5VZj0hMDt0aGlzLkJjPXRoaXMudmg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksdGhpcy55YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlgsIjsiLHR5cGVvZiBhLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWD9hLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlg/dHlwZW9mIGEuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5JYT9hLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILklhP3R5cGVvZiBhLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5uZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm5lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC54ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlZoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApNYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkxjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saWg6ZnVuY3Rpb24oKXtpZighdGhpcy5PYyl7dmFyIGE9dGhpcy5MYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk9jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5PYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk9jfSxFbTpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLkNtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxDbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2QmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLm9kPSEwKTtyZXR1cm4gdGhpcy5vZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGY9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihmPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe3RoaXMuUG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sUG46ZnVuY3Rpb24oKXt0aGlzLkJjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixmPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihmPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7aWYoZS5EKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO2UuRCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxjcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5MaCgpfS5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuRW0oKSl7dmFyIGI9dGhpcy5MYygpLGY9dGhpcy5NYygpO2ImJmYmJih0aGlzLkJjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudmg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCksYT10aGlzLk1jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZj0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilmPSEwO2Z8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmCmIoZi5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5IY3x8KHRoaXMuSGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkhjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5IYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp3YjpmdW5jdGlvbigpe3JldHVybiBlLkdlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGUuRCgiZ2lnYS5kZSIpfHxlLkQoInNwaWVsZXRpcHBzLmRlIil8fGUuRCgia2luby5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSl0aGlzLlVmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5EKCJnaWdhLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLlFjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuVGwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkdlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlVmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlVmLGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMubXF8fCgxMDx0aGlzLmhwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmhwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuV24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sV246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaXApe3RoaXMuaXA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5ya3x8eWE7KGZ1bmN0aW9uKGMpe2MudGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmppKHdpbmRvdyk7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspdHJ5e2I9Ynx8dGhpcy5qaShhW2ZdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxqaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGUuUGUoYikpe2Zvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihhPW5ldyB4YShiW2ZdKSxhLmdhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy4kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5xZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlYoYSk6dGhpcy5VKCl9LHpuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2IsZj10aGlzLmphKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLm5jJiYoMDw9Zi5pbmRleE9mKGQpfHxiLkxkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5xZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMucWYrKztpZigxMDx0aGlzLnFmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sCllkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgUj1jLlRqfHxSOyhmdW5jdGlvbihjKXtjLlNqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGUpaWYodGhpcy5NYnx8KHRoaXMuTWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5NYisrLDE1PHRoaXMuTWIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5MZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMud2IoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBmPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWY9ITA7Znx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmYihmLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkpsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5KbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS56bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuU2p8fENhOyhmdW5jdGlvbihjKXtjLlVqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZj1uZXcgUihhW2JdKTtmLmdhfHx0aGlzLk0oZil8fCh0aGlzLk4oZiksCihuZXcgQ2EoZix0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVWp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnhtfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5maChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkJuPWEucG9zaXRpb25pbmc7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS53aWR0aD1hLndpZHRoO2Yuc3R5bGUubWluV2lkdGg9CmEud2lkdGg7Zi5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Yuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQm4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGYpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmLGIpfXRoaXMuVChmKTt0aGlzLlYoZik7dGhpcy5CZD1mfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkJkKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtlLkFoKHRoaXMuQmQpOwplLlllKHRoaXMuQmQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxkZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMud2p8fEdhOyhmdW5jdGlvbihjKXtjLnZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLnZqfHxJYTsoZnVuY3Rpb24oYyl7Yy54aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5maChhLCJlbGVtZW50SUQiKTtpZihlLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy54anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuRmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE1rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuJGc9dGhpcy5HaT0hMTt0aGlzLk1oPWQ7dGhpcy5raT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJm0mJm0uYWYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuJGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuamIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmtpP3RoaXMuamIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5qYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5qYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbSYmbS5hZih0aGlzLkZhLnVybCkmJiFiP2UudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTptLmFmKHRoaXMuRmEudXJsKSx0aGlzLk1oJiZ0aGlzLk1oKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5rZT0hMX1jLmJqPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMua2U9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxVbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXtDcDoiQWRDbGlja1RocnUiLEVwOiJBZEVycm9yIixGcDoiQWRTdG9wcGVkIiwKSXA6IkFkTGluZWFyQ2hhbmdlIixKcDoiQWRUYWdQYXJzZWQiLE1wOiJBZFZpZGVvQ29tcGxldGUiLFBwOiJBZExvYWRlZCIsUXA6IkFkU2tpcHBlZCIsUnA6IkFkU3RhcnRlZCIsR3A6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixIcDoiQWRJbXByZXNzaW9uIixEcDoiQWRDcmVhdGl2ZVZpZXciLEtwOiJBZFZpZGVvTWlkcG9pbnQiLExwOiJBZFBhdXNlZCIsTnA6IkFkVmlkZW9TdGFydCIsT3A6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5rZSxhW2RdKX0sVG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmplKWZvcih2YXIgYSBpbiB0aGlzLkdhLmplKXRoaXMuR2EuamUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5qZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMua2UmJnRoaXMuVW4oKTt0aGlzLkdhJiZ0aGlzLlRuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5vYj0iIjt0aGlzLnBkPXRoaXMuZGM9dGhpcy5uYj1udWxsO3RoaXMuU2c9dGhpcy56Yj10aGlzLmNmPSExO3RoaXMuQWE9IiI7dGhpcy5iZj0hMTt0aGlzLnFhPXRoaXMuTmM9IiI7dGhpcy5YZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy53Zj0hMTt0aGlzLmhhPVtdO3RoaXMuVGU9dGhpcy5UYj0iIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuZ2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5CYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy4kYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5VYj0iIjt0aGlzLlZiPVtdO3RoaXMuV2I9W107dGhpcy5hZD1bXTt0aGlzLnNjPSIiO3RoaXMuRmI9ITE7dGhpcy5YZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm1jPSExO3RoaXMuSGc9dGhpcy5iZT1udWxsO3RoaXMuSmY9dGhpcy5oYj10aGlzLlJnPXRoaXMuJGQ9dGhpcy5WZj10aGlzLnJkPXRoaXMud2M9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5HZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5EYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmpkPXRoaXMua2Q9IiI7dGhpcy5rYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5XYz1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsCmFkdGFncGFyYW1ldGVyOnRoaXMub2IsYWR0YWdtb2RpZmllcjp0aGlzLm5iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5kYyxhZHRhZ3JlZ2V4OnRoaXMucGQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuY2Ysc2lkZWxvYWRzOnRoaXMuemIsZGlzYWJsZXRlc3RzOnRoaXMuU2csaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5iZixnbG9iYWxDb25maWc6dGhpcy5OYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuWGUsc2VydmVyOnRoaXMuaGEsc3ZtQ29uZmlnOnRoaXMuVGIsaG9tYWRBZHBhdGg6dGhpcy5UZSxIT01BRF9WRVJJRklFRDp0aGlzLmhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5nZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5CYixIT01BRF9BREJMT0NLRVI6dGhpcy4kYix0ZXN0SGlkZTp0aGlzLlViLHRlc3RUYWdzOnRoaXMuVmIsdGVzdFRhZ3NKUzp0aGlzLldiLAp0ZXN0VGFnc1hIUjp0aGlzLmFkLHRlc3QzUENvb2tpZTp0aGlzLnNjLHRocm90dGxlOnRoaXMuWGQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5tYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMud2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnJkLHVzZVN0cmljdENoZWNrczp0aGlzLlZmLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLiRkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMuQWYsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmFiLHZwYWlkOnRoaXMuaGIsc2tpcEFsbG93ZWQ6dGhpcy5KZix2bWFwczp0aGlzLiRmLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5EYyxhZEZhbGxiYWNrVVJMOnRoaXMua2QsYWRGYWxsYmFja0NvbmZpZzp0aGlzLmpkLHlpZWxkbGFiOnRoaXMua2J9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMub2I9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5uYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLmRjPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMucGQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5jZj1iLmpzcG9wdXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpZGVsb2FkcyYmKHRoaXMuemI9Yi5zaWRlbG9hZHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZGlzYWJsZXRlc3RzJiYodGhpcy5TZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYKKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmJmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLk5jPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNCbG9ja2VkJiYodGhpcy5YZT1iLmlzQmxvY2tlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXImJih0aGlzLmhhPWIuc2VydmVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuVGI9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5UZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5oZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmdlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLkJiPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuJGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJih0aGlzLlViPWIudGVzdEhpZGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3MmJih0aGlzLlZiPWIudGVzdFRhZ3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NKUyYmKHRoaXMuV2I9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYKKHRoaXMuYWQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnNjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5YZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5tYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5IZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkQmxvY2tlckRldGVjdGVkJiYodGhpcy53Yz1iLmFkQmxvY2tlckRldGVjdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnJkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5WZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLiRkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy4kYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMuQWY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYodGhpcy5hYj1iLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudnBhaWQmJih0aGlzLmhiPWIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLkpmPWIuc2tpcEFsbG93ZWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy4kZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkRjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tVUkwpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja0NvbmZpZyYmKHRoaXMuamQ9Yi5hZEZhbGxiYWNrQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnlpZWxkbGFiJiYodGhpcy5rYj1iLnlpZWxkbGFiKX0sb206ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmKGI9ITApO3JldHVybiBifSxDZjpmdW5jdGlvbihiKXt0aGlzLiRhW2JdPSEwfSxZbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxXZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5RYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLiRrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGc9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuJGUoYik7CmM9dGhpcy5hYShiKTtnPyh0aGlzLlBjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMub2J8fHRoaXMubmJ8fHRoaXMuZGN8fHRoaXMucGQpJiYoaD10aGlzLmRuKGgpKTtiPW5ldyBDKGUpO2IudXJsPWU7ZT0iIjtlPWc/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuJGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSwkZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlBjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxQYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5oYSYmdGhpcy5oYS5sZW5ndGgmJjA8dGhpcy5oYS5sZW5ndGgmJihhPXRoaXMuaGFbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sYWY6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy4kZShiKTtyZXR1cm4gYX0sCiRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLllwO3JldHVybiJub25lIn0sSGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYVt0aGlzLkFmXX0scGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhkKCksYT10aGlzLkhmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEloOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZyl7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxjbjpmdW5jdGlvbihiLGEpe3ZhciBkPWUuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPGgubGVuZ3RoO0IrKyl7dmFyIGs9aFtCXS5zcGxpdCgiPSIpO2dba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZ1tsXT10aGlzLkloKGdbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5JaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGRuOmZ1bmN0aW9uKGIpe3RoaXMub2ImJgooYis9dGhpcy5vYik7aWYodGhpcy5uYilmb3IodmFyIGEgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm5iW2FdKSk7dGhpcy5kYyYmKGI9dGhpcy5jbihiLHRoaXMuZGMpKTtyZXR1cm4gYn0scGw6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuamwodGhpcy55YS5jbGllbnRBUElzKX0samw6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE5hO2IucHVibGlzaGVyQVBJJiZhLmtvKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5qbyhiLnBsYXllcik7YS5mKCl9fSxnOmZ1bmN0aW9uKGIsYSxkLGcsYyxlKXttPXRoaXM7dGhpcy5iZj0hMDt0aGlzLk5jPWI7dGhpcy5xYT1hO3RoaXMud2Y9ZDt0aGlzLmJlPWc7dGhpcy5oYz1jO3RoaXMueWE9ZXx8e307dGhpcy5wbCgpO3RoaXMuVG0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5SbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuRmMoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5GYygpfWNhdGNoKGspe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9fSx4YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sVG06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuTmMrdGhpcy52ZSgiZ2xvYmFsIikpLHRoaXMubW0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5GYygpfS5iaW5kKHRoaXMpLCEwKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy52ZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5GYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5DZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sdmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlFiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMucmQpe3RoaXMucmQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGYpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaGM9CiExKTsiZm9jdXMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5oYz0hMSk7dGhpcy5oYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhjP3RoaXMuaGMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlhlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLmdlKSk7dGhpcy5ZYigpO2UuSmMoay54bik7KGE9ZS5VYSh0aGlzLkhkKCkpKXx8KGE9ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbW06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJgooZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5UYnx8dGhpcy5BYXx8dGhpcy5GYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpLHRoaXMuWWIoKSl9fSxGYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExOwp0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGY7KGY9dm9pZCAwPT09YSl8fChmPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5IZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihmKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5EKCJ3ZWIuZGUiKXx8ZS5EKCJnbXgubmV0Iil8fGUuRCgiZ214LmF0Iil8fGUuRCgiZ214LmNoIil8fGUuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlBjKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5laShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuamQ9ZC5hZF9mYWxsYmFja19jb25maWd8fAohMTt0aGlzLlRiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5UZT1kLmFkcGF0aHx8IiI7dGhpcy5BZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlRiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLlJjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKSx0aGlzLlliKCkpfSxlaTpmdW5jdGlvbihiKXt0aGlzLmtkfHwodGhpcy5rZD1ifHwiIil9LFJjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucGMoKSksZD10aGlzLmFhKHRoaXMuVGIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsCiIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuVGIrdGhpcy52ZSgiY3VzdG9tZXIiKSk7dGhpcy5LYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm1jPSEwO3RoaXMuUmMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fApkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuVmY9dGhpcy5nYihkLnN0cmljdCk7dGhpcy4kZD10aGlzLmdiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlJnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5hYj10aGlzLmdiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5nYihkLmVuYWJsZWQpO3RoaXMuVWI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5XYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmFkPWQudGVzdGFkdGFnc3hocnx8CltdO3RoaXMuc2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMub2I9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5kYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucGQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuY2Y9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuaGI7dGhpcy5KZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnNkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy4kZj1kLnZtYXBzfHwiIjt0aGlzLkRjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmVpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5qZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5YZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMua2I9CmQueWllbGRsYWJ8fG51bGw7IXRoaXMubWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1jPSEwLHRoaXMuUmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT28oKSYmKHRoaXMuVWJ8fHRoaXMuV2J8fHRoaXMuVmJ8fHRoaXMuYWQpP3RoaXMud2Y/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLkJiKSksdGhpcy5CZSgpLHRoaXMuWWIoKSk6dGhpcy5HbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlJmKCkpfX0sWG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSksYj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6Yixob21hZF91cmxfc3VmZml4X2Jhc2U2NDplLnBiKGIpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07ZS5RYyh0aGlzLnBjKCksIlBPU1QiLGIsZnVuY3Rpb24oYil7dHJ5e3ZhciBhPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXt9ZS50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghYXx8IWEubGVuZ3RoKSwhMCk7dHJ5e2EmJmEubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlciYmKHRoaXMub2IrPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihhWzBdLmlkKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgYT0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuWSgxMCksaD1lLlkoMTApLEI9ZS5ZKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwpiKEIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKStiKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnBiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUuQWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApOwpyZXR1cm59dGhpcy5zYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sUmY6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKTt0aGlzLlliKCl9LCRjOmZ1bmN0aW9uKGIsYSl7dGhpcy53Yz0hMDt0aGlzLmtiJiYhdGhpcy5IaT8odGhpcy5YbSgpLHRoaXMuSGk9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoYixhKX0uYmluZCh0aGlzKSw1MDApKTp0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIoYikpLHRoaXMuWWIoKSx0aGlzLkJlKCkpfSxGbzpmdW5jdGlvbigpe2lmKHRoaXMuVWIpe3ZhciBiPWUuQWQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkptKCkpdGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7CnRyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVWIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5VYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChnKXt9Yj90aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm5pKCl9fWVsc2UgdGhpcy5uaSgpfSxQZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuUWIoKSksdGhpcy5LbyhnLAowPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLk9mLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLk9mKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5WYj10aGlzLmFkKSYmdGhpcy5WYi5sZW5ndGgpe3ZhciBkPXRoaXMuVmIuc2xpY2UoKSxnPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5PZigpfSxLbzpmdW5jdGlvbihhLGYsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5RYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5QZi5iaW5kKHRoaXMpLGYuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5QZigpfX1mdW5jdGlvbiBmKCl7dGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLldiJiZ0aGlzLldiLmxlbmd0aCl7dmFyIGQ9dGhpcy5XYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlBmKCl9LExvOmZ1bmN0aW9uKGEsZixkKXtmdW5jdGlvbiBnKCl7ZSgpJiZmKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZil7Zj09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sT2Y6ZnVuY3Rpb24oKXtpZih0aGlzLnNjKXRyeXtlLlFjKHRoaXMuc2MsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRmI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5SZigpfS5iaW5kKHRoaXMpLHRoaXMubGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5saSgpfWVsc2UgdGhpcy5SZigpfSxsaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpO3RoaXMuWWIoKTt0aGlzLkJlKCl9LEptOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApZYjpmdW5jdGlvbigpe3ZhciBhPSIwIixmPSIwIjt0cnl7ZS5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLndjJiYoZj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitmLCEwKTsodGhpcy5DYSYmdGhpcy5pc0VuYWJsZWQmJmUuRCgiY2hpcC5kZSIpfHxlLkQoImZvY3VzLmRlIikpJiZ0aGlzLmNsKCk7dGhpcy5zYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkZiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5oZSkpO3RoaXMuYmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5iZSYmdGhpcy5iZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5GYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuV2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5XYy5pZD1lLlkoMTApO3RoaXMuV2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLldjKTt2YXIgYT0KdGhpcy5XYy5jb250ZW50V2luZG93LGY9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Quc3JjPSJodHRwczovL3Vwcy54cGxvc2lvbi5kZS9sb2FkZXIvOTE2MjgvZGVmYXVsdC5qcz94cGxyZGlyPTEiO2EuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKTtmLnNyYz1lLnllKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZS50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sCm9sOmZ1bmN0aW9uKCl7aWYodGhpcy4kZCYmdGhpcy5vbSgpKXt2YXIgYT10aGlzLllsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxzaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZixkLGcsYyxoKXt0aGlzLkdkfHwodGhpcy5HZD0wKTt0aGlzLkdkKys7dGhpcy5HZD50aGlzLnBoJiYhdGhpcy5xaCYmKHRoaXMucWg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLnBoLCEwKSk7YT1uZXcgTWEoYSxmLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpOwpnJiYoYS5HaT0hMCk7YyYmZS5IbSgpJiYoYS4kZz0hMCk7aCYmKGEua2k9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLmFufHwodGhpcy5hbj0hMCxlLkRhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhmPWEucmVzcG9uc2VYTUwpfHwoZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJgpnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlBjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1lLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGYpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLiRmfSxtbDpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hcC5iaW5kKHRoaXMpLHRoaXMuJG8uYmluZCh0aGlzKSl9LGFwOmZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsO3RyeXsoZj1hLnJlc3BvbnNlWE1MKXx8KGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5JbCgpfSwkbzpmdW5jdGlvbigpe30sSWw6ZnVuY3Rpb24oKXtlLkpjKGsuSGwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEJlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09Zi50eXBlJiZlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWYudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LE9vOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGR9LFFiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGY9IiIsZD0wO2Q8YTtkKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGZ9LGdiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PQphfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGY9IiIsZCxnLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZj1mKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspOwpyZXR1cm4gZn0sYWE6ZnVuY3Rpb24oYSl7dmFyIGY9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtmW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixmKXtiJiYoZC5xdWVyeUtleVtiXT1mKX0pO3JldHVybiBkfSxIZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBmKGEpe3ZhciBiPQoiIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsYis9Zi50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWVbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyllW2ddPWQoZVtnLTNdXmVbZy04XV5lW2ctMTRdXmVbZy0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnF8biZyfHEmcikrdStlW2ddKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihmKGgpK2YoaykrZihsKStmKG0pK2YodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnVqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLkJrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZixkKXt0aGlzLmE9CmE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5iaS5iaW5kKHRoaXMpLG11dGU6dGhpcy5sZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEucmI7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5pYz10aGlzLnFkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zjt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5VZD17fTtlLnViKCJuZXdCaWdBZElkIik7dGhpcy5hbD1lLlkoMTApO3RoaXMuTGY9MDt0aGlzLm5kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMubmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMubmQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYKInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVWM9dGhpcy5UZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy51ZT0hMTt0aGlzLnZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubmM9ITE7dGhpcy56bD1lLlkoMTApO3RoaXMuUGI9ZS5ZKDEwKTt0aGlzLk5iPWUuWSgxMCk7dGhpcy5naT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmNlPXRoaXMuWmI9dGhpcy5GZT10aGlzLnhkPXRoaXMuVmQ9dGhpcy5BYj10aGlzLnVjPXRoaXMuUGg9dGhpcy5FZT10aGlzLkNkPXRoaXMuUG89dGhpcy5EYj10aGlzLk9iPSExO3RoaXMuemM9W107dGhpcy5vYz17fTt0aGlzLnRuPTIwMDt0aGlzLmNnPXRoaXMuY2Q9dGhpcy5FYz10aGlzLmJnPXRoaXMudmY9ITE7CnRoaXMubmY9e319Yy5vaj1hO2EucHJvdG90eXBlPXskbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGY9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBmfSx0aTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5MYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMud28oKTtlLm8oay5Kayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmZjpmdW5jdGlvbihhLGYsZCxjKXt0aGlzLkRiPWQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQS5TKXRoaXMuTGYrKyxlLnViKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxjPW0uZ2V0Q29uZmlnKCksZS5HZSYmKHRoaXMuQS5hbyh7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksCmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy50aSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpmLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpmPyh0aGlzLnRpKCksbmV3IFModGhpcyxhLHRoaXMuR2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaGIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB3Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3Yy5mZihhLGYsZCl9LDUwKX19LHJmOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5jZT10aGlzLlpiPXRoaXMuRWU9dGhpcy5DZD0hMTt0aGlzLmI9YTt0aGlzLnFvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLnpjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5VZD10aGlzLmltKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBmPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGY9dGhpcy5iaChiLnBhcmVudCkpLGYucHVzaCh0aGlzLlNsKGIpKSk7CnJldHVybiBmfSxTbDpmdW5jdGlvbihhKXt2YXIgZj0iIixkPVtdO2lmKGEmJmEuTCYmYS5MLmdldEF0dHJpYnV0ZSl7Zj1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmYsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGY9W10sZD1bXSxjPVtdLGU9W10saD0iIjtpZihhLkwpe2Y9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPQowO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKWQucHVzaChhLnNiKGZba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGY9YS5lcnJvci5kZXRhaWwuY29kZSksYS56ZCYmYS56ZC5lcnJvciYmYS56ZC5lcnJvci5jb2RlJiYoZj1hLnpkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZWQuY29kZTpmPT1GLmxlLmNvZGU/ZS5vKGsudnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnUoKSk6KGUuZ2YoKSxmPT1GLmdnLmNvZGUmJmUubyhrLmduLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpO2UubyhrLkdsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54bygpO3RoaXMuV2EoImVtcHR5Iik7dGhpcy5BLkZiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRmIsITApO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLmJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaGcuY29kZTplLm8oay53cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5tZS5jb2RlOmUubyhrLnhwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTsKYnJlYWs7Y2FzZSB2LmllLmNvZGU6ZS5vKGsuaG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB2LmZlLmNvZGU6ZS5vKGsuWW8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB2LmRnLmNvZGU6ZS5vKGsuWm8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMuamMoYSk7dGhpcy5RYSgpfSxqYzpmdW5jdGlvbihhKXt2YXIgZj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZj1hLmVycm9yLmNvZGUsOTAxPGYmJihmPTkwMCkpO2ZvcihmPXsiW0VSUk9SQ09ERV0iOmZ9O2EuT2EubGVuZ3RoOyl0cnl7dmFyIGQ9YS5PYS5wb3AoKTt0aGlzLmVmKGQudXJsLGQudHlwZSxmKX1jYXRjaChjKXt9fSwKcW86ZnVuY3Rpb24oYSl7dGhpcy5GZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuR2YodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihmPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9ZjtmPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2QmJmQuZW52dmFycyYmKGM9ZC5lbnZ2YXJzKCkpO2MudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRWQmJihjPWQuRWQoKSk7Yy52aWRlb1Nsb3QmJihmPWMudmlkZW9TbG90LHRoaXMudmY9ITApfWNhdGNoKGgpe31mLnhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihmLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pOwppZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmYuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuU2smJnRoaXMucGxheWVyLk1lKCkmJihmLnZvbHVtZT10aGlzLnBsYXllci5NZSgpLzEwMCk7Zm9yKDtmLmZpcnN0Q2hpbGQ7KWYucmVtb3ZlQ2hpbGQoZi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZi5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZixhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnZmJiZmLmxvYWQoKTtpZih0aGlzLm9pKGYpKXt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGYpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMudmY/dGhpcy52aWRlbz1mOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChmKX1jYXRjaChsKXt0aGlzLnZpZGVvPWZ9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZiksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxvbzpmdW5jdGlvbigpe3RoaXMuYmc9ITA7CnRoaXMuQWI9dGhpcy51Yz0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5BYj0hMCk7ZS5DZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5vYSYmZS5Sayh0aGlzLmIub3JpZ2luLm9hKTt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlFoKCk7dGhpcy5hLklmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5JZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5HZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy56aSgidnBhaWQiKTsKaWYodGhpcy5BYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlNiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfXRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7CnRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5HZih0aGlzLkYsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkYub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMua2EmJnRoaXMuYS5jLmthKCkmJihhPSEwKTt2YXIgYj10aGlzLmIubG0oKSxjPXRoaXMuYi5zLk9yaWdpbmFsQWRQYXJhbWV0ZXJzO2lmKGImJmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgaD10aGlzLkEuZ2V0Q29uZmlnKCk7aCYmaC5hZEZhbGxiYWNrQ29uZmlnJiZoLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihjPUpTT04uc3RyaW5naWZ5KGguYWRGYWxsYmFja0NvbmZpZykpfXZhciBrPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLAphZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5sYSh0aGlzLkYsImNvbmZpZyIsayk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsCiJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnllKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7ZS53ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5HYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuemM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5qcChhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLmtwKCksdGhpcy5hLmxjKCEwKSwhdGhpcy5aYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5aYj17ZWw6dGhpcy5GLApjYjpmdW5jdGlvbigpe3RoaXMuY2U9ITA7ZS5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuWmUodGhpcy5aYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmxjKCEwKSx0aGlzLm9wKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5sYyghMCksdGhpcy5zcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ycCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnRwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnBwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkVpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5xYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkEuRGN8fHRoaXMuY2QpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5jZCYmKHRoaXMuY2c9ITEsdGhpcy5yYygpKSx0aGlzLm1wKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuQWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlNiKCJtdXRlZCIsInVzZXIiKSxlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5BYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuU2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuVGYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsuc2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7ZS53ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLndlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnhnKGZ1bmN0aW9uKGEpe2UubGEodGhpcy5GLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sbHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnVjPSEwfSxtcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmxkLHRoaXMuYi5zLAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudWM9ITF9LG9wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsudGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuc2csdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5paSgpO2UubyhrLm9nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2UubyhrLmxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuQ2Q9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmxnLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxycDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSx0cDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0scHA6ZnVuY3Rpb24oKXt0aGlzLlhmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sRWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGY9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZik7CmUuQ2UoKTt0aGlzLkY9ITE7dGhpcy5RYShhKX19LGpwOmZ1bmN0aW9uKGEpe3ZhciBmPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWYmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGY9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGYubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTtlLm8oay51cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuRWkoITApfSxOazpmdW5jdGlvbihhLGYpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUGMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChmLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuZ3AuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoZix0aGlzLkEpKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFFrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuWmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sUGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuQmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5aZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5pY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljfHx0aGlzLlpmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWWspKX0sWmY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWQmJnRoaXMub2kodGhpcy52aWRlbykmJiF0aGlzLk9iJiYhdGhpcy5pYyl7dGhpcy5xZD0hMDt0cnl7aWYoIWUuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuT2J8fCh0aGlzLk9iPSEwLHRoaXMuUGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5ZYSgpLCEwKSx0aGlzLkEuUmd8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChmKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLmVwKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuSWYoKTt0aGlzLmNwKCk7dGhpcy56aSgpO3RoaXMuQWcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuTWYoKX19LE1mOmZ1bmN0aW9uKCl7dGhpcy54ZHx8dGhpcy5tZygpfSxtZzpmdW5jdGlvbihhKXt2YXIgZj10aGlzLnZpZGVvLnBsYXkoKTtpZihmJiZmWyJjYXRjaCJdKWZbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnhkfHwoYT90aGlzLlFhKCk6KHRoaXMubGYoITApLHRoaXMubWcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMudWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk1mKCkpfS5iaW5kKHRoaXMpO3RoaXMuT2UoKS5maSh0aGlzKX0sWGY6ZnVuY3Rpb24oKXt0aGlzLkEuYWImJiF0aGlzLk9iJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWGEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5FZT0hMDtlLm8oay5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUWEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBmPVtdLGQ9ITEsYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZS5naChhW2NdKSxmLnB1c2goZCk7YT17aGFzaGVzOmZ9O2E9ay5TYShhLHRoaXMudSgpKTtlLnVvKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5lZSYmdGhpcy5Layh0aGlzLmIuZWUpOwppZighdGhpcy5GZSlpZih0aGlzLkZlPSEwLHRoaXMuY2V8fChlLm8oay5sbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5DYnx8dGhpcy5iLnhjKXtlLnViKCJuZXdTbWFsbEFkSWQiKTt0aGlzLkxmKys7dGhpcy5pYz10aGlzLnFkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGYpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnhpKCl9Y2F0Y2goaCl7fXRoaXMuVmQ9ITA7dGhpcy5hLlNlKCk7dGhpcy5uYz0hMTt0aGlzLk9lKCkuJGgoKTt0aGlzLmIuQ2ImJnRoaXMuYi5vcmlnaW4ubWYoKTt0aGlzLmIueGMmJihhP3RoaXMuYi5vcmlnaW4uSmgoKTp0aGlzLndkKCkpfWVsc2UgdGhpcy53ZCgpfSwKZ3A6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLllmKGEpKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5pYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTt0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxDaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5RYSgpO2Vsc2V7dGhpcy5uYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkdjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5UbyhhKTtpZighdGhpcy5aYil7dmFyIGY9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGY9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlpiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5jZT0hMDtlLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmYscGVyY2VudDpkLHN0YXJ0VGltZTohMX07ZS5aZSh0aGlzLlpiKX1kPSIiO3RoaXMuYi5LZiYmKGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5naSkpJiYoZD10aGlzLmIuS2YtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIiwKZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlRkfHwodGhpcy5UZD0hMCxmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5zZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5DYj8odGhpcy5pYz10aGlzLnFkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmliLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEueGkoKSx0aGlzLmIub3JpZ2luLm1mKCkpOnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxmLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMubmQucmVwbGFjZSgiW3RpbWVdIixlLmFoKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudWU9ITA7CnRoaXMudmlkZW8uY29udHJvbHM9ITF9fSx1aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuQ2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxUbzpmdW5jdGlvbihhKXtlLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudml8fHRoaXMuT2J8fCgwPT1hJiYodGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMuQS5GYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuRmIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy51aSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMudWkoKX0uYmluZCh0aGlzKSksdGhpcy5PYnx8CnRoaXMuaWkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5hYiYmdGhpcy5YYSgic3RhcnQiKSxlLm8oay5vZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGUubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMuQ2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLm8oay5sZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLAplLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy52aT1hKX0saGk6ZnVuY3Rpb24oYSxmKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsZiwhMCl9LHdvOmZ1bmN0aW9uKCl7ZS5iZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxpaTpmdW5jdGlvbigpe2UuYmQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtlLmJkKFsic3RhdHNfaGRfYWRfZW1wdHk6IisKdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2UuYmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuYmd8fHRoaXMuQS5hYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxTYjpmdW5jdGlvbihhLGYpe3RoaXMuQS5hYiYmZS50cmFjaygic3RhdHNfaGRfIithLGYsITApfSx0cmFjazpmdW5jdGlvbihhLGYpe2lmKCF0aGlzLk9iKXt0aGlzLm5mJiZ0aGlzLm5mLnRyYWNrJiZ0aGlzLm5mLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZS5HZSYmZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09CiEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5FYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlVkLmltcHJlc3Npb25zJiZlLkZtKGgudXJsLHRoaXMuVWQuaW1wcmVzc2lvbnMpP3RoaXMuZWYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UubyhrLklrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5lZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZil0cnl7dGhpcy5iLk9hPXRoaXMuQ2wodGhpcy5iLk9hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsCmY9IiI7dGhpcy5iZyYmKGY9Il92cGFpZCIpO3RoaXMuY2QmJihmPSJfd2VsZWN0Iik7cmV0dXJuIGErZn0sZWY6ZnVuY3Rpb24oYSxmLGQsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZj10aGlzLkEud2EoYSksZCYmZi5NayhkKSxjfHwoYz10aGlzLlFnKSxlfHwoZT10aGlzLlFnKSx0aGlzLk9rKGEpLHRoaXMuQS5LYShmLGZ1bmN0aW9uKCl7dGhpcy5aaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlpoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxPazpmdW5jdGlvbihhKXt0aGlzLm9jW2FdPSJvcGVuIn0sWmg6ZnVuY3Rpb24oYSl7dGhpcy5vY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLm9jPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZjtmb3IoZiBpbiB0aGlzLm9jKXRoaXMub2MuaGFzT3duUHJvcGVydHkoZikmJiJvcGVuIj09dGhpcy5vY1tmXSYmYSsrO3JldHVybiBhfSxqbTpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0KZn0pfSxDbDpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Zn0pfSxlcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2Eud2cmJmEud2codGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGUuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMucmMoKTtlbHNlIGlmKHRoaXMuYi5xYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5EZXx8KHRoaXMuYi5EZT0xKTtpZigxMDA+YS10aGlzLmIuRGUpcmV0dXJuO3RoaXMuYi5EZT1hfWNhdGNoKGYpe31lLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQoiX3RvcCI7aWYodGhpcy5BLkRjfHx0aGlzLmNkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnFifWNhdGNoKGYpe2E9d2luZG93Lm9wZW4odGhpcy5iLnFiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX19fS5iaW5kKHRoaXMpLDUwMCl9fSxjcDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5uZC5yZXBsYWNlKCJbdGltZV0iLGUuYWgoMCkpO3ZhciBmPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5zZCYmKGY9dGhpcy5BLnNkKTtmJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhiLmJpbmQodGhpcyksMUUzKmYpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5zZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sClJkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEuc2QpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZS5OZih0aGlzLmNvbnRyb2xzKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuUGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucmkuYmluZCh0aGlzKSksZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5yaS5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnBpLmJpbmQodGhpcykpLGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLk5iO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmdpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLktmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLndpZHRoPSIxMDAlIixmLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixmLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixmLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixmLnN0eWxlLmJvdHRvbT0iMHB4IixmLnN0eWxlLnpJbmRleD0iMTAwMDAiLGYuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGYpO3RoaXMuYS54ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5sZigpKTt0aGlzLkliKCl9fSxJYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHJjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmNnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpKX0scmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnVjPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudWM9ITEpOihlLmxhKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy51Yz0hMCl9LExkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuU2IoIm11dGVkIiwidXNlciIpLGUubyhrLkpkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpOwp0aGlzLkFiPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5TYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxxYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYyk7dGhpcy54ZHx8dGhpcy51ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTWYoKSl9LHdkOmZ1bmN0aW9uKCl7dGhpcy5PbSgpJiZ0aGlzLk5tKCkmJih0aGlzLkEud2N8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuTGImJnRoaXMuVW8oKXx8KHRoaXMueGQ9ITAsdGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy5MZygpKX0sT206ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCk7aWYoIXRoaXMuQS5oYnx8ZS5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGY9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuRGEoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZitkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuVWN8fChhPQohMCxmLmFkRmFsbGJhY2tVUkx8fChmLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkVjJiZmLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5VY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRWM/ImFueSI6IiIpKyhmLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5VYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRWMmJmYuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlVjfSxabDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxmPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1mLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmYuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1lLnllKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5mZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy53ZCgpfXZhciBmPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWmwoKTt0aGlzLkVjPXRoaXMuVWM9dGhpcy5jZD10aGlzLmNnPSEwO3JldHVybiBmPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2YsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy50bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlNlKCksdGhpcy5hLlluKCksdGhpcy5uYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkVlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5PZSgpLiRoKCkpfSxPZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxBZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLlllKHRoaXMudmlkZW8sYSk/dGhpcy5iaSgpOnRoaXMuTGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5xYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5DYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy56YyYmMDx0aGlzLnpjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy56YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5hbCsiLSIrdGhpcy5MZjt0aGlzLmImJnRoaXMuYi5oaCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuaGgoKSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5sa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtmPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlg9W107dGhpcy5MPW51bGw7dGhpcy55Yz10aGlzLkFjPSExO3RoaXMub2E9IiI7dGhpcy5hZz0hMTt0aGlzLnNoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGYsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZj1mdW5jdGlvbigpe3JldHVybiBjKCkmJihlLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRCgiZmFuZG9tLmNvbSIpfHxlLkQoImdpZ2EuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGMoKXx8ZigpKXt2YXIgaD1lLk5nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGY9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuRCgiZ2lnYS5kZSIpfHxlLkQoImtpbm8uZGUiKXx8ZS5EKCJzcGllbGV0aXBwcy5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZigpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1kKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLldkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5LYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxkaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkxiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChmKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5MYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuTGJ8fHRoaXMuTG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0uRW8oKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sTG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2M9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksYz1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkduKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLnNoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWC5sZW5ndGgpdGhpcy5UYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuZWQse2Vycm9yOnRoaXMuYWc/Ri5sZTpGLmZnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGQpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLlgubGVuZ3RoP3RoaXMuVGMoKTp0aGlzLnJhKHRoaXMuUmEodi5lZCx7ZXJyb3I6dGhpcy5hZz9GLmxlOkYuZmd9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuZWcse2RlcHRoOmJ9KSl9LFRjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWC5zaGlmdCgpO3RoaXMuUG0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubWgoKSxmLHtBZFN5c3RlbTp0aGlzLlJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmhnKSk6KGI9MCx0aGlzLldvKCkmJnRoaXMucmYodGhpcy5CbCgpKSl9LG1mOmZ1bmN0aW9uKCl7dGhpcy5BYz8odGhpcy5BYz0xPHRoaXMuWC5sZW5ndGgsCnRoaXMuWC5sZW5ndGgmJnRoaXMuVGMoKSk6dGhpcy5wYXJlbnQubWYoKX0sSmg6ZnVuY3Rpb24oKXt0aGlzLnljPyh0aGlzLnljPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLlRjKCkpOnRoaXMucGFyZW50LkpoKCl9LFdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLktjKCk/dGhpcy5yYSh0aGlzLlJhKHYuZmUpKTp0aGlzLnJhKHRoaXMuUmEodi5kZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuZWQsRi5nZykpLCExKX0scmY6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuZWV8fChhLmVlPVtdKTthLmVlLnB1c2godGhpcy5zaCk7YS5PYT1hLk9hLmNvbmNhdCh0aGlzLmhmKCkpO2EuQ2I9YS5DYj9hLkNiOnRoaXMuQWM7YS54Yz1hLnhjP2EueGM6dGhpcy55YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWmc7dGhpcy5wYXJlbnQucmYoYSl9LApCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLktjKCk7YS5PPXRoaXMuamgoKTthLnFiPXRoaXMuVWwoKTthLkVxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUWwoKTthLktmPXRoaXMuaG0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpkLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGMpe319dGhpcy5MJiYoYS5PYT1hLmVycm9yLmNvZGUhPXYuZmUuY29kZT9hLk9hLmNvbmNhdCh0aGlzLlZsKCkpOmEuT2EuY29uY2F0KHRoaXMuZG0oKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5qYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmpjJiZ0aGlzLnBhcmVudC5qYyhhKSxiPTAsdGhpcy5UYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGpjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmpjKGEpfSxUZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxNbzpmdW5jdGlvbigpe3JldHVybiBiPApmfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuamgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5LYygpfSxRZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LG1pOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5RZigpJiYoYT0hMCk7cmV0dXJuIGF9LEduOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5hZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxQbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLm1oKCkubGVuZ3RofSxtaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5lKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFJsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmUodGhpcy5MLCJBZFN5c3RlbSIpfSxoZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1jJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fAphLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnpoKGEpKXt2YXIgZj1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Yy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpmLHVybDp0aGlzLnNiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxWbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmpoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFpwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnNiKGFbZF0pfSk7dmFyIGM9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGI9Zi5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxRbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixkPSExLGM9W10sYj0hMSxmPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Y9Yj10aGlzLkZkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWMucHVzaChkKTtlLnB1c2goZil9MTxhLmxlbmd0aD8oYj1jLGg9Zik6KGI9ZCxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxLYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnNiKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGhtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsYz0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGM9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUudG8oYyxhKSwwPmImJihiPSExKX1jYXRjaChmKXtiPSExfXJldHVybiBifSxOZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuc2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxzYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkZkKGEpOiIifSxGZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5RZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5QaXx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk89W107dGhpcy5xYj0iIjt0aGlzLnM9dGhpcy54Yz10aGlzLkNiPSExO3RoaXMuVWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlZlPSIifWMuVmo9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5PLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sYm06ZnVuY3Rpb24oKXtpZighdGhpcy5VZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm5hKXt2YXIgYT10aGlzLm9yaWdpbi5uYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5VZT1hW2RdKX1yZXR1cm4gdGhpcy5VZX0saGg6ZnVuY3Rpb24oKXtpZih0aGlzLlZlKXJldHVybiB0aGlzLlZlO3ZhciBhPSIiOyhhPXRoaXMuYm0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlZlPWF9LGxtOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2NdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Wanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5PaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXttZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixOYToiWE1MX1BBUlNFX0VSUk9SIn0sZGc6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGVkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGhnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApOYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTmE6IkxPQURfRVJST1IifSxpZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKenA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTmE6Ik1FRElBRklMRV9FUlJPUiJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE5hOiJEVU1NWV9BRCJ9fSxGPXtmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE5hOiJOT19BRFMifSxnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTmE6Ik5PX01FRElBRklMRVMifSxBcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGxlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Laj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBXYT1jLktqfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnpkPWM7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmRqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLk5sfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuYWk9YTt0aGlzLnZpZGVvPWM7dGhpcy5hZT1bXTt0aGlzLlloPVtdO3RoaXMub2Y9W107dGhpcy5mcD0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLkJwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYWkubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5haVthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLnRxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Wbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Nbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuYWUucHVzaCh7c3JjOmQsZnJhbWU6aCx2bjplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5vZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLm9mW2NdO2QudHlwZT09PWEmJmQuZmwodGhpcy5XbChhKSl9fSwKV2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7Q3E6ITAsQnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7cXE6InZpZGVvIixGcToianNDdXN0b20iLEdxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsSHE6MSwkcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LAprbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuYWUubGVuZ3RoO2MrKylpZih0aGlzLmFlW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYWVbY10udm47cmV0dXJuIiJ9LFZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5ZaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5rbShjKSx2ZW5kb3I6Y30pO3RoaXMudm8oKX0sTW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLmZwLm1hcChmdW5jdGlvbihhKXt0aGlzLnlnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMueWcoYSxjKX0seWc6ZnVuY3Rpb24oYSxjKXt0aGlzLm9mLnB1c2goe3R5cGU6YSxmbDpjLHpxOiExfSl9LHZvOmZ1bmN0aW9uKCl7dGhpcy5ZaC5tYXAoZnVuY3Rpb24oYSl7YS5JbXx8KGEuc3Eoe2FkU2Vzc2lvbklkOmUuWSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuRHEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5JbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLlhrfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLnJiPWEuZWgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWSgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy56Zz0hMTsKdGhpcy5lYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxDbzpmdW5jdGlvbigpe3RoaXMuemc9ITB9LHhpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkdjLHRoaXMuYy5sKCkpfSxZbjpmdW5jdGlvbigpe3RoaXMuemd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay52ZCx0aGlzLmMubCgpKSl9LElmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnJiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5yYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLnJiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMucmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5yYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5yYik7CnRoaXMuYy5YYyYmdGhpcy5jLlhjKCk/dGhpcy5jLmVoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sc206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGxjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5yYik7aWYoYy54IT10aGlzLkhhLnh8fGMueSE9dGhpcy5IYS55fHxjLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLkhhLndpZHRofHxjLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuU2UoKTtyZXR1cm59dGhpcy5IYT1jO3RoaXMuYy5YYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmVjLmxlbmd0aDthKyspdGhpcy5lY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLk5mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGMuYmluZCh0aGlzKSwxMCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLmVjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5lYy5wdXNoKGEpfSxTZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ybj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMucm58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5PZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sT2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGJiPWMuUGp8fGJiOyhmdW5jdGlvbihjKXtjLk9qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuYmM9dGhpcy5iY3x8ITE7dGhpcy5wZz10aGlzLnJnPQp0aGlzLndoPXRoaXMudmE9dGhpcy5TZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5TZj0hMDt0aGlzLndoJiZ0aGlzLkdnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuS2I7YSYmYS5uYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpOwp0aGlzLkNnKCl9LEdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmMpe3RoaXMudGQoKTtpZighdGhpcy5TZiYmIXRoaXMudGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlNmJiZ0aGlzLnBnJiYhdGhpcy5yZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19LHRkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxraDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxDZzpmdW5jdGlvbigpe2lmKHRoaXMudGQoKSl7dmFyIGE9CnRoaXMua2goImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5yZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnBnPWEuWHB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2coKX0uYmluZCh0aGlzKSwxMDApfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5vcSgpOiExfSxLYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuS2MoKTotMX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sS2w6ZnVuY3Rpb24oYSxiKXt0aGlzLmJjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLmJjfHwzMDI9PXRoaXMuYmM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuYmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuV2UoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5lbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBjYj1jLk9qfHxjYjsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEttOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlpqLkZrLkRrP3dpbmRvdy5PTy5aai5Gay5Eay5WcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5QZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGNiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlFqfHxkYixlYj1uZXcgZGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5FbHx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5uaCgpfSxuaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE1hOmZ1bmN0aW9uKCl7dGhpcy5UaCgpfSxUaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVml8fGdiOyhmdW5jdGlvbihjKXtjLlVpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRGcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlVpfHxoYjsoZnVuY3Rpb24oYyl7Yy5XaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFdoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLldoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5XaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLldpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLldrfHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5paz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxYYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuaWt8fFU7KGZ1bmN0aW9uKGMpe2MuaGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5tZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp3Lm1kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubm4oYSl9LmJpbmQodGhpcykpO3cubWQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5tZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0sbm46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5pYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLktkJiYoYT1lLkRsKGEsdGhpcy5LZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk0oZCkpe3RoaXMuTihkKTsKdmFyIGc9bmV3IFYoZCx0aGlzLkcpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLktkfHwodGhpcy5LZD1bXSksdGhpcy5LZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGc9bmV3IFYoZCx0aGlzLkcpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbWQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0sTm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5TY3x8Cih0aGlzLlNjPVtdKSx0aGlzLlNjLnB1c2goYSksdGhpcy5YbigpJiYodGhpcy55ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuU2MpZm9yKHZhciBhPTA7YTx0aGlzLlNjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuU2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5ObyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Tbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMuU298fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5SaXx8bWI7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuU2l8fApuYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuTShoKXx8KHRoaXMuTihoKSwobmV3IG5iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlRpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5ra3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLkljPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9CiEwKTt2YXIgYj10aGlzLlZnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5JYz1iKTtpZighdGhpcy5JZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRWQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVihiKTt0aGlzLkxuKHRoaXMuZ2V0UmF3UGxheWVyKCksCmEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHdnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTt0aGlzLmdjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5nYyYmdGhpcy5nYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdHJ5e3RoaXMuZ2NbYV0oKX1jYXRjaChiKXt9fSxFZDpmdW5jdGlvbigpe2lmKHRoaXMuSWMpcmV0dXJuIHRoaXMuSWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVmcoYSkpcmV0dXJuIHRoaXMuSWM9YX19LFZnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxMbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCwKZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS51bm11dGUmJgp0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0seGg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Nanx8cmI7KGZ1bmN0aW9uKGMpe2MuTGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5FZCgpP3RoaXMuQygpOih0aGlzLkhlfHwodGhpcy5IZT0xKSx0aGlzLkhlKyssMTAwPHRoaXMuSGU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Manx8c2I7KGZ1bmN0aW9uKGMpe2MuTmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyBzYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Oanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy5ranx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sCk1hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudmt8fHZiOyhmdW5jdGlvbihjKXtjLnVrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxKbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPQpbXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5CYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkpuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuTWMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7CnJldHVybn1pZighdGhpcy5CYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudWt8fHdiOyhmdW5jdGlvbihjKXtjLndrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTsKdGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgd2IoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMud2t8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLndtfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5zZj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTAwKX0sQW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5XJiZ0aGlzLlcoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx5bzpmdW5jdGlvbigpe3RoaXMuc2Y9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudGM9MH0sZjpmdW5jdGlvbigpe3RoaXMuJG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnRjfHwodGhpcy50Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy50Y3x8dGhpcy50YysrLHRoaXMudGM8PXRoaXMuJG0/KHRoaXMudGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnlvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQmI9Yy5ja3x8QmI7KGZ1bmN0aW9uKGMpe2MuZWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkcpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy55cHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5HYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUW0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm5nKCl8fHRoaXMuaSghMCl9LFFtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HYigpOyFhLnBhJiZhLlgmJmEuVXAmJmEuV3AmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2IoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZmQuR2IoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXS5pZD09YiYmKHRoaXMuTmg9YVtmXSk7cmV0dXJuIHRoaXMuTmh9LHBxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5HYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5mZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmZkLkdiKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmZkLkdiPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5mZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5wbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMucG58fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVihiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxucTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApYYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Ianx8WDsoZnVuY3Rpb24oYyl7Yy5Haj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnRmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMudGYmJmMhPXRoaXMudGZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuRCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEudXEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkdqfHxZOyhmdW5jdGlvbihjKXtjLklqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy55ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLklqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLk5pfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlYoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sZGk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGtuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0sQWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5BZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE9iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMudW58fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLllpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVihiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxkaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxrbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLllpfHxTYjsoZnVuY3Rpb24oYyl7Yy5aaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkFlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWml8fFRiOyhmdW5jdGlvbihjKXtjLiRpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgU2IoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBUYihjLHRoaXMuRykpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuJGl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLnFufHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlYoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxLbjpmdW5jdGlvbigpe3RoaXMuZGQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5kZHx8KHRoaXMuZGQ9ITAsdGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZGQmJih0aGlzLlpkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZGQ9ITEpLHRoaXMuWmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLnprfHxYYjsoZnVuY3Rpb24oYyl7Yy55az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmZjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5mYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGguYmluZCh0aGlzKSwxMCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuR2s9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkdrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxrZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5mYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2cuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5YaCgpO3RoaXMua2coKTt0aGlzLk5uKCl9LE5uOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuSG4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuSG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5mYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy55a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5LbigpLGE9bmV3IFliKGEsCnRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkFrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuVGt8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm5rPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZW49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGRpOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZZChhKX0uYmluZCh0aGlzKSl9LFlkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBOPWMubmt8fE47KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5MZSlpZih0aGlzLk1ifHwodGhpcy5NYj0wKSx0aGlzLk1iKyssMTU8dGhpcy5NYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5tbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLndiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5ta3x8TzsoZnVuY3Rpb24oYyl7Yy5vaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnlmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5va3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMueW58fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkNqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5WKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuQ2p8fFo7KGZ1bmN0aW9uKGMpe2MuQmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5PYz10aGlzLkJhPXRoaXMub2Q9ITE7dGhpcy5WaD1lLlFiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2IoKT8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkJqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Eaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkRqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy52bXx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVihiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5panx8aGM7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5oanx8aWM7KGZ1bmN0aW9uKGMpe2Muamo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmdhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmpqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Wa3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuemUoKTt0aGlzLkJnKCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemUuYmluZCh0aGlzKSwxMDApfSx6ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnplLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlVrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuTWQ9W107dGhpcy54Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5mbShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmNpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy54Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMueGZbZF07dGhpcy5XZihjKSYmKHRoaXMuTWQucHVzaChjKSx0aGlzLmNpKGMpKX19LFdmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0sZm06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMueGZbZF0sdGhpcy5XZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxjaTpmdW5jdGlvbihhKXt0aGlzLldmKGEpJiZhLmYoKX0sQW86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuTWQubGVuZ3RoO2ErKyl0aGlzLk1kW2FdLlhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTWRbYV0uWGIpfX19KShjKTt2YXIgcmM9CmMuWGp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuSmp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZS5KYyhrLlhvKSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5KYyhrLmpuKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHhjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksdmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbD0hMTtILmZhKCk7SC55aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnloKCksCmZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmEoKTt2YXIgeWM9eGMoZnVuY3Rpb24oKXtlLllnKHdpbmRvdyxILkFtKCkse2lkOnljfSl9LDUwMCksaWE9ZS5ZKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Daz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuQ2t8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5TaD10aGlzLmNvbmY9dGhpcy5KYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSWQ9MDt0aGlzLmViPSIiO3RoaXMuTmQ9W107dGhpcy5PZD0wO3RoaXMuVWg9ITE7dGhpcy51Zj1bXTtlLnViKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtpbzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPQphO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGNvOmZ1bmN0aW9uKGEpe3RoaXMuSmI9YX0sYm86ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gY30sWWM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuQm0oKSl0aGlzLkpiLmcodGhpcy5KYi5OYyx0aGlzLkpiLnFhLHRoaXMuSmIud2YsZnVuY3Rpb24oKXt0aGlzLlljKGEsYyl9LmJpbmQodGhpcyksdGhpcy5KYi5oYyk7ZWxzZSBpZih0aGlzLnBtKCkpdGhpcy5abihmdW5jdGlvbigpe3RoaXMuWWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkdjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLGw9Cm5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuQ28oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS51YigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBRYShsLHRoaXMuSmIsaCk7bC4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWm0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5kZiYmKGQ9dGhpcy5wbGF5ZXIuZGYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZmYoYSxkLGcpO3RoaXMucGxheWVyLmZpKGwpfX0sQm06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5JZClyZXR1cm4gYz1hLmdldFRpbWUoKS0KdGhpcy5JZC5nZXRUaW1lKCksdGhpcy5JZD1hLDNFNTxjPyEwOiExO3RoaXMuSWQ9YTtyZXR1cm4hMX0sc286ZnVuY3Rpb24oKXtlLnViKCJwcmVyb2xsIik7ZS5EZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlVnKGEpKT90aGlzLlljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlNoKXtlLkRmKCJwb3N0cm9sbCIpO2UudWIoInBvc3Ryb2xsIik7dGhpcy5pbyghMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7CihkPXRoaXMuVWcoZCkpP3RoaXMuWWMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9fSxVZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sUm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbyh0aGlzLnJvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk1hKCl9LFNkOmZ1bmN0aW9uKGEpe2UudWIoIm1pZHJvbGwiKTtlLkRmKCJtaWRyb2xsIik7aWYoIXRoaXMuSGgpe3RoaXMuSGg9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuWWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGg9CiExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnZkLHRoaXMucGxheWVyLmwoKSkpfX0sUW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmpmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLnNvKCk7dGhpcy5wbGF5ZXIuamYmJnRoaXMuUW4oKTt0aGlzLlJuKCl9LFNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGYpe3RoaXMuTmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmtiKGEsYixjLGYsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsCmFbY10ubWFjcm8pfXRoaXMuT2Q9dGhpcy5OZC5sZW5ndGh9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLk9kJiYoYT0hMCk7cmV0dXJuIGF9LFpuOmZ1bmN0aW9uKGEpe3RoaXMuVWg9YTtmb3IoYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fbi5iaW5kKHRoaXMpKX0sRW46ZnVuY3Rpb24oYSl7dGhpcy5PZC0tO2EmJnRoaXMudWYucHVzaChhKTswPj10aGlzLk9kJiZ0aGlzLlVoKCl9LFptOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLnVmLmxlbmd0aDtkKyspYz10aGlzLnVmW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLkxpfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucGt8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoeG9vU2VpaG9BY2hhYWNoaSx4b29TZWlob0FjaGFhY2hpKTsK
- 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
- 25b8c26212dbd48007be24a885e489432092cdeb9ae7d70a223d5cd88582205d
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
257 B
1 KB
|
49ms
49ms
|
XHR
application/json |
13.224.194.16
AMAZON-02
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=1312486853
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHhvb1NlaWhvQWNoYWFjaGk9eG9vU2VpaG9BY2hhYWNoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucGZ8fCh3LnBmPTApO3cucGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5wZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZWEoKXtpZighbCl2YyhlYSw1MCk7ZWxzZSBpZighZS53bil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmRsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkdjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uQ2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5FZihjKTtiLmNvKG0pO2IuYm8obCk7Yi5TbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0uemIubGVuZ3RoKXt2YXIgYj1tLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGY7Zj1lLmxvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2ZbIltMT0FEU0NSSVBUXSJdXT1lLkZoLmJpbmQoZSk7d2luZG93W2ZbIltVVElMU10iXV09bTtmb3Iod2luZG93W2ZbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBmIGluIGIpbFtmXT1iW2ZdO3QoYyxhKX07Zj1iLnNjcmlwdHMuc2hpZnQoKTspZS5GaChmLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLkxiPSJzZXR1cCI7dGhpcy5aYz1bXTt0aGlzLkNlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRG4uYmluZCh0aGlzKSk7dGhpcy50Yj17fTt0aGlzLnJoPXt9O3RoaXMuQmY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy50Yil0aGlzLnRiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy50YlthXSsiXyIpO3JldHVybiBifSxrYzpmdW5jdGlvbigpe3RoaXMuQmZ8fCh0aGlzLkJmPWUuWSgxMCkpO3JldHVybiB0aGlzLkJmfSx1YjpmdW5jdGlvbihiKXt0aGlzLnRiW2JdfHwodGhpcy50YltiXT0wKTt0aGlzLnRiW2JdKz0xOzU8dGhpcy50YltiXSYmIXRoaXMucmhbYl0mJih0aGlzLnJoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxDZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxEbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5DbihiLmRhdGEpfSxDbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx3ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5RYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGdoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuT2woYikpcmV0dXJuOyhhPXRoaXMuTmcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxYZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sTW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZmg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sR2Y6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5BbChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9nPWNbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmdsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE5mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LEFoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFllOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZyk7Yz49YSYmKGU9ITApO3JldHVybiBlfSxaZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlllKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlplKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFFiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxSZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSGY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZis9Zy50b1N0cmluZygxNik7cmV0dXJuIGZ9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcD1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO3A9ZTtuPWg7bD16O3k9azt0PW07Zm9yKGc9MDsxOT49ZztnKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZz02MDs3OT49ZztnKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eitsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxwYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGc+PjQsZT0oZyYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZyk/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sSG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxBZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZWM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxwKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1wO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sWGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sdW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sUmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlFpKCl8fApiLlhpKCl8fGIudW0oKXx8Yi5SaigpfHxiLnhrKCl8fGIuRWooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuWmsoKX0sVGw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGYpe2EmJihkLnF1ZXJ5S2V5W2FdPQpmKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHA9Yi5sZW5ndGg7ZzxwOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxnbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LERsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxnLnB1c2goYltwXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocCl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sYWg6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy53aShhKSsiOiIrdGhpcy53aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sd2k6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LERmOmZ1bmN0aW9uKGIpe3RoaXMuTGI9Yn0sWWc6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5MYjt0aGlzLnRlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChwKXt0aGlzLnduPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEpjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5ZZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxwLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtwJiYoeD1rLlNhKHgscCkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtlLkpjKHgpfSxGbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5rYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudGUoYil9LHRlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRm4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0ucGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLkthKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bS5wYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShnLCEwKTtnPW0ud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxiZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPW0ucGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bS53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTttLkthKGQpfX0sZ2Y6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0ubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2YoKX0uYmluZCh0aGlzKSw1MDApfSxOZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMuc2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxRZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sc2I6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5GZChiKToiIn0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5RZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS4kZShiKXx8dGhpcy5NbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnpmJiZ3aW5kb3cuc2FuZGJveC56ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5YZyhiKSlyZXR1cm4gdGhpcy5YZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9CiExfWUudXJsJiZlLmhhc2gmJihlPWEuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUGsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZyxjLGUsaCx4KXt2YXIgaz1lfHxtO2U9ITA7eCYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGUsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxnLGMsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFFjOmZ1bmN0aW9uKGIsYSxkLGcsYyxlLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5RYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuWmMpZm9yKHZhciBjIGluIHRoaXMuWmMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5aY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5iYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlVtKGcuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlpjPWJ9LGtiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuaG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudnA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5HbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnhwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnRnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmxnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5xZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS51Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Eub2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5icD17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkhsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS52ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkdjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Euc2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5sZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Euc2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLklrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5EaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmxuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ybz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLnltfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e1JlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZz1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5EZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkRkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5SZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LEFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuUmUodGhpcy5jbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLApkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5EZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihmKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBmKWdbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBmW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGZbY10pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBmPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZjtyZXR1cm4gZ319KGMsZltjXSk6ZltjXTtmPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zi5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWY7Zi5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGZ9O2MuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1uPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5tbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Xaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLkxhPQp7fTt0aGlzLkc9bnVsbDt0aGlzLlZjPTEwMDt0aGlzLlJiPTA7dGhpcy5WYT0xNTA7dGhpcy5YYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlJiPD10aGlzLlZhPyh0aGlzLlJiKyssdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSk6MD50aGlzLlZhJiYodGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSl9LFhuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmI+dGhpcy5WYT8hMDohMX0seWY6ZnVuY3Rpb24oKXt0aGlzLlJiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxlbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5qYSgpXT1hO0wmJkwuRWgmJkwuQW8oYSl9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIGUuUGUodGhpcy5MYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZjtmb3IoZiBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZl0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX0sR206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx5cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLldqfHxxOyhmdW5jdGlvbihjKXtjLllqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVmM9MTA7dGhpcy5SYj0wO3RoaXMuVmE9NTA7dGhpcy5XPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuS2I9IiI7dGhpcy5QZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZj10aGlzLlRhKCksCmQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZilhLmNvbnRhaW5lcklkPWYuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5XPWF9LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV30saG86ZnVuY3Rpb24oYSl7dGhpcy5rZj1hfSxncTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtmfSxqZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUmI8PXRoaXMuVmEmJih0aGlzLlJiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5WYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxBcTpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5xbSgpfHx0aGlzLkxrKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApqcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sVTpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFhjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxkZjpmdW5jdGlvbigpe3JldHVybiExfSxmaTpmdW5jdGlvbihhKXt0aGlzLktiPWF9LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2J9LCRoOmZ1bmN0aW9uKCl7dGhpcy5LYj1udWxsfSxscTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuS2ImJihhPSEwKTtyZXR1cm4gYX0sdnE6ZnVuY3Rpb24oKXt0aGlzLlBnfHwodGhpcy5QZz0hMCl9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5Zanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmlnPSIxIjt0aGlzLmpnPSIyIjt0aGlzLkVrPSIzIjt0aGlzLmdkPTA7dGhpcy5ibj0zMDt0aGlzLmFjPVtdO3RoaXMubGI9W107dGhpcy52Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy52Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuZ2Q7dGhpcy5pZD1lLlkoMTApO3RoaXMuRWYoYSk7dGhpcy5mbyhiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxlLmdmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx6bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmtjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5rYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV09MX0sRG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZj1uZXcgSTt3aW5kb3dbZi5mYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUua2MoKSYmKHRoaXMuRmYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBmPSEwO2EmJihmPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnptKCk7CmlmKCF0aGlzLkRtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkZmKCk7cmV0dXJufXRoaXMuRmYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxmKTt0aGlzLnNpKCk7dGhpcy52Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5hYy5wdXNoKGEpLHRoaXMubGIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHNpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5hYyYmMDx0aGlzLmFjLmxlbmd0aCYmKHRoaXMuYWM9ZS51bmlxdWUodGhpcy5hYyksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYWMuam9pbigiLCIpKSk7aWYodGhpcy5sYil7Zm9yKHZhciBmPTA7Zjx0aGlzLmxiLmxlbmd0aDtmKyspdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl09PXRoaXMudmNbYV0mJmIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl08CnRoaXMudmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksYT10aGlzLmxiW2ZdLnJlYXNvbik7dGhpcy52Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihmPWUudW5pcXVlKGIpLGE9YSsiLSIrZi5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlnfSxGZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuamd9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Fa30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmdkfSxuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5pZ30sU3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmdkfSxFZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5UcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLnNufHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMudmI9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5XZygpO3RoaXMuS2UoKTt0aGlzLnhsPSExfSxXZzpmdW5jdGlvbigpe3RoaXMudmI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnZiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5LZSgpO2lmKHRoaXMudmIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxLZTpmdW5jdGlvbigpe2lmKCF0aGlzLnZiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMudmI9ITApO3RoaXMuVihiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5XJiYoMCx0aGlzLlcpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmtmJiYoMCx0aGlzLmtmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy56anx8c2E7KGZ1bmN0aW9uKGMpe2MueWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5nZDt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5yZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkViPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGY9MDtmPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2YrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ZdLnRhZyl7dGhpcy5FYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkViPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkViPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuRWI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGY9MDtmPApkLmxlbmd0aDtmKyspYS5vbihkW2ZdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZl0mJih0aGlzLnBlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZl0mJnRoaXMuTGgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuRWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuS2I7YiYmKGIuTGQoKSxiLndkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5oZC5pbmRleE9mKGIpJiZ0aGlzLmhkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5oZC5sZW5ndGg+PXRoaXMucmUmJnRoaXMuaSgpKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5KZT90aGlzLkplKys6dGhpcy5KZT0xOnRoaXMuSWU/CnRoaXMuSWUrKzp0aGlzLkllPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLk5mKGIudmlkZW9UYWcpP2IudmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5wZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSWU+dGhpcy5KZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLldnKCksYi5LZSgpLGIudmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy55anx8dGE7KGZ1bmN0aW9uKGMpe2MuQWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZiYmZigpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGY9MDtmPGIubGVuZ3RoO2YrKylhLnB1c2goYltmXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBmPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpmLnZifHx0aGlzLk0oZil8fHRoaXMuR20oZil8fCh0aGlzLk4oZiksZj1uZXcgdGEoZix0aGlzLkcpLGYuSigpLGYuZigpKX19dGhpcy5QKCl9fSxlcTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUucGIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkZqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWWQoYSl9LmJpbmQodGhpcykpfSxZZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5XJiZ0aGlzLlcoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGYpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGYpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuT2M9dGhpcy5CYT10aGlzLm9kPSExO3RoaXMuVmg9ZS5RYigxMCk7dGhpcy5VZj0hMDt0aGlzLkJjPXRoaXMudmg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksdGhpcy55YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlgsIjsiLHR5cGVvZiBhLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWD9hLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlg/dHlwZW9mIGEuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5JYT9hLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILklhP3R5cGVvZiBhLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5uZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm5lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC54ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlZoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApNYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkxjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saWg6ZnVuY3Rpb24oKXtpZighdGhpcy5PYyl7dmFyIGE9dGhpcy5MYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk9jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5PYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk9jfSxFbTpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLkNtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxDbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2QmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLm9kPSEwKTtyZXR1cm4gdGhpcy5vZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGY9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihmPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe3RoaXMuUG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sUG46ZnVuY3Rpb24oKXt0aGlzLkJjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixmPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihmPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7aWYoZS5EKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO2UuRCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxjcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5MaCgpfS5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuRW0oKSl7dmFyIGI9dGhpcy5MYygpLGY9dGhpcy5NYygpO2ImJmYmJih0aGlzLkJjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudmg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCksYT10aGlzLk1jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZj0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilmPSEwO2Z8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmCmIoZi5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5IY3x8KHRoaXMuSGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkhjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5IYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp3YjpmdW5jdGlvbigpe3JldHVybiBlLkdlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGUuRCgiZ2lnYS5kZSIpfHxlLkQoInNwaWVsZXRpcHBzLmRlIil8fGUuRCgia2luby5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSl0aGlzLlVmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5EKCJnaWdhLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLlFjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuVGwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkdlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlVmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlVmLGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMubXF8fCgxMDx0aGlzLmhwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmhwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuV24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sV246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaXApe3RoaXMuaXA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5ya3x8eWE7KGZ1bmN0aW9uKGMpe2MudGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmppKHdpbmRvdyk7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspdHJ5e2I9Ynx8dGhpcy5qaShhW2ZdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxqaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGUuUGUoYikpe2Zvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihhPW5ldyB4YShiW2ZdKSxhLmdhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy4kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5xZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlYoYSk6dGhpcy5VKCl9LHpuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2IsZj10aGlzLmphKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLm5jJiYoMDw9Zi5pbmRleE9mKGQpfHxiLkxkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5xZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMucWYrKztpZigxMDx0aGlzLnFmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sCllkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgUj1jLlRqfHxSOyhmdW5jdGlvbihjKXtjLlNqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGUpaWYodGhpcy5NYnx8KHRoaXMuTWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5NYisrLDE1PHRoaXMuTWIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5MZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMud2IoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBmPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWY9ITA7Znx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmYihmLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkpsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5KbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS56bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuU2p8fENhOyhmdW5jdGlvbihjKXtjLlVqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZj1uZXcgUihhW2JdKTtmLmdhfHx0aGlzLk0oZil8fCh0aGlzLk4oZiksCihuZXcgQ2EoZix0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVWp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnhtfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5maChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkJuPWEucG9zaXRpb25pbmc7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS53aWR0aD1hLndpZHRoO2Yuc3R5bGUubWluV2lkdGg9CmEud2lkdGg7Zi5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Yuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQm4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGYpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmLGIpfXRoaXMuVChmKTt0aGlzLlYoZik7dGhpcy5CZD1mfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkJkKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtlLkFoKHRoaXMuQmQpOwplLlllKHRoaXMuQmQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxkZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMud2p8fEdhOyhmdW5jdGlvbihjKXtjLnZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLnZqfHxJYTsoZnVuY3Rpb24oYyl7Yy54aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5maChhLCJlbGVtZW50SUQiKTtpZihlLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy54anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuRmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE1rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuJGc9dGhpcy5HaT0hMTt0aGlzLk1oPWQ7dGhpcy5raT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJm0mJm0uYWYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuJGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuamIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmtpP3RoaXMuamIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5qYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5qYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbSYmbS5hZih0aGlzLkZhLnVybCkmJiFiP2UudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTptLmFmKHRoaXMuRmEudXJsKSx0aGlzLk1oJiZ0aGlzLk1oKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5rZT0hMX1jLmJqPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMua2U9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxVbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXtDcDoiQWRDbGlja1RocnUiLEVwOiJBZEVycm9yIixGcDoiQWRTdG9wcGVkIiwKSXA6IkFkTGluZWFyQ2hhbmdlIixKcDoiQWRUYWdQYXJzZWQiLE1wOiJBZFZpZGVvQ29tcGxldGUiLFBwOiJBZExvYWRlZCIsUXA6IkFkU2tpcHBlZCIsUnA6IkFkU3RhcnRlZCIsR3A6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixIcDoiQWRJbXByZXNzaW9uIixEcDoiQWRDcmVhdGl2ZVZpZXciLEtwOiJBZFZpZGVvTWlkcG9pbnQiLExwOiJBZFBhdXNlZCIsTnA6IkFkVmlkZW9TdGFydCIsT3A6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5rZSxhW2RdKX0sVG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmplKWZvcih2YXIgYSBpbiB0aGlzLkdhLmplKXRoaXMuR2EuamUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5qZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMua2UmJnRoaXMuVW4oKTt0aGlzLkdhJiZ0aGlzLlRuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5vYj0iIjt0aGlzLnBkPXRoaXMuZGM9dGhpcy5uYj1udWxsO3RoaXMuU2c9dGhpcy56Yj10aGlzLmNmPSExO3RoaXMuQWE9IiI7dGhpcy5iZj0hMTt0aGlzLnFhPXRoaXMuTmM9IiI7dGhpcy5YZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy53Zj0hMTt0aGlzLmhhPVtdO3RoaXMuVGU9dGhpcy5UYj0iIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuZ2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5CYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy4kYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5VYj0iIjt0aGlzLlZiPVtdO3RoaXMuV2I9W107dGhpcy5hZD1bXTt0aGlzLnNjPSIiO3RoaXMuRmI9ITE7dGhpcy5YZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm1jPSExO3RoaXMuSGc9dGhpcy5iZT1udWxsO3RoaXMuSmY9dGhpcy5oYj10aGlzLlJnPXRoaXMuJGQ9dGhpcy5WZj10aGlzLnJkPXRoaXMud2M9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5HZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5EYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmpkPXRoaXMua2Q9IiI7dGhpcy5rYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5XYz1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsCmFkdGFncGFyYW1ldGVyOnRoaXMub2IsYWR0YWdtb2RpZmllcjp0aGlzLm5iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5kYyxhZHRhZ3JlZ2V4OnRoaXMucGQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuY2Ysc2lkZWxvYWRzOnRoaXMuemIsZGlzYWJsZXRlc3RzOnRoaXMuU2csaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5iZixnbG9iYWxDb25maWc6dGhpcy5OYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuWGUsc2VydmVyOnRoaXMuaGEsc3ZtQ29uZmlnOnRoaXMuVGIsaG9tYWRBZHBhdGg6dGhpcy5UZSxIT01BRF9WRVJJRklFRDp0aGlzLmhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5nZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5CYixIT01BRF9BREJMT0NLRVI6dGhpcy4kYix0ZXN0SGlkZTp0aGlzLlViLHRlc3RUYWdzOnRoaXMuVmIsdGVzdFRhZ3NKUzp0aGlzLldiLAp0ZXN0VGFnc1hIUjp0aGlzLmFkLHRlc3QzUENvb2tpZTp0aGlzLnNjLHRocm90dGxlOnRoaXMuWGQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5tYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMud2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnJkLHVzZVN0cmljdENoZWNrczp0aGlzLlZmLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLiRkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMuQWYsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmFiLHZwYWlkOnRoaXMuaGIsc2tpcEFsbG93ZWQ6dGhpcy5KZix2bWFwczp0aGlzLiRmLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5EYyxhZEZhbGxiYWNrVVJMOnRoaXMua2QsYWRGYWxsYmFja0NvbmZpZzp0aGlzLmpkLHlpZWxkbGFiOnRoaXMua2J9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMub2I9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5uYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLmRjPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMucGQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5jZj1iLmpzcG9wdXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpZGVsb2FkcyYmKHRoaXMuemI9Yi5zaWRlbG9hZHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZGlzYWJsZXRlc3RzJiYodGhpcy5TZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYKKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmJmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLk5jPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNCbG9ja2VkJiYodGhpcy5YZT1iLmlzQmxvY2tlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXImJih0aGlzLmhhPWIuc2VydmVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuVGI9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5UZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5oZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmdlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLkJiPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuJGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJih0aGlzLlViPWIudGVzdEhpZGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3MmJih0aGlzLlZiPWIudGVzdFRhZ3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NKUyYmKHRoaXMuV2I9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYKKHRoaXMuYWQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnNjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5YZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5tYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5IZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkQmxvY2tlckRldGVjdGVkJiYodGhpcy53Yz1iLmFkQmxvY2tlckRldGVjdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnJkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5WZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLiRkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy4kYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMuQWY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYodGhpcy5hYj1iLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudnBhaWQmJih0aGlzLmhiPWIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLkpmPWIuc2tpcEFsbG93ZWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy4kZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkRjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tVUkwpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja0NvbmZpZyYmKHRoaXMuamQ9Yi5hZEZhbGxiYWNrQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnlpZWxkbGFiJiYodGhpcy5rYj1iLnlpZWxkbGFiKX0sb206ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmKGI9ITApO3JldHVybiBifSxDZjpmdW5jdGlvbihiKXt0aGlzLiRhW2JdPSEwfSxZbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxXZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5RYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLiRrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGc9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuJGUoYik7CmM9dGhpcy5hYShiKTtnPyh0aGlzLlBjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMub2J8fHRoaXMubmJ8fHRoaXMuZGN8fHRoaXMucGQpJiYoaD10aGlzLmRuKGgpKTtiPW5ldyBDKGUpO2IudXJsPWU7ZT0iIjtlPWc/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuJGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSwkZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlBjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxQYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5oYSYmdGhpcy5oYS5sZW5ndGgmJjA8dGhpcy5oYS5sZW5ndGgmJihhPXRoaXMuaGFbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sYWY6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy4kZShiKTtyZXR1cm4gYX0sCiRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLllwO3JldHVybiJub25lIn0sSGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYVt0aGlzLkFmXX0scGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhkKCksYT10aGlzLkhmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEloOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZyl7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxjbjpmdW5jdGlvbihiLGEpe3ZhciBkPWUuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPGgubGVuZ3RoO0IrKyl7dmFyIGs9aFtCXS5zcGxpdCgiPSIpO2dba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZ1tsXT10aGlzLkloKGdbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5JaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGRuOmZ1bmN0aW9uKGIpe3RoaXMub2ImJgooYis9dGhpcy5vYik7aWYodGhpcy5uYilmb3IodmFyIGEgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm5iW2FdKSk7dGhpcy5kYyYmKGI9dGhpcy5jbihiLHRoaXMuZGMpKTtyZXR1cm4gYn0scGw6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuamwodGhpcy55YS5jbGllbnRBUElzKX0samw6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE5hO2IucHVibGlzaGVyQVBJJiZhLmtvKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5qbyhiLnBsYXllcik7YS5mKCl9fSxnOmZ1bmN0aW9uKGIsYSxkLGcsYyxlKXttPXRoaXM7dGhpcy5iZj0hMDt0aGlzLk5jPWI7dGhpcy5xYT1hO3RoaXMud2Y9ZDt0aGlzLmJlPWc7dGhpcy5oYz1jO3RoaXMueWE9ZXx8e307dGhpcy5wbCgpO3RoaXMuVG0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5SbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuRmMoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5GYygpfWNhdGNoKGspe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9fSx4YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sVG06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuTmMrdGhpcy52ZSgiZ2xvYmFsIikpLHRoaXMubW0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5GYygpfS5iaW5kKHRoaXMpLCEwKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy52ZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5GYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5DZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sdmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlFiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMucmQpe3RoaXMucmQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGYpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaGM9CiExKTsiZm9jdXMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5oYz0hMSk7dGhpcy5oYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhjP3RoaXMuaGMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlhlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLmdlKSk7dGhpcy5ZYigpO2UuSmMoay54bik7KGE9ZS5VYSh0aGlzLkhkKCkpKXx8KGE9ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbW06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJgooZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5UYnx8dGhpcy5BYXx8dGhpcy5GYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpLHRoaXMuWWIoKSl9fSxGYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExOwp0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGY7KGY9dm9pZCAwPT09YSl8fChmPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5IZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihmKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5EKCJ3ZWIuZGUiKXx8ZS5EKCJnbXgubmV0Iil8fGUuRCgiZ214LmF0Iil8fGUuRCgiZ214LmNoIil8fGUuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlBjKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5laShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuamQ9ZC5hZF9mYWxsYmFja19jb25maWd8fAohMTt0aGlzLlRiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5UZT1kLmFkcGF0aHx8IiI7dGhpcy5BZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlRiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLlJjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKSx0aGlzLlliKCkpfSxlaTpmdW5jdGlvbihiKXt0aGlzLmtkfHwodGhpcy5rZD1ifHwiIil9LFJjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucGMoKSksZD10aGlzLmFhKHRoaXMuVGIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsCiIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuVGIrdGhpcy52ZSgiY3VzdG9tZXIiKSk7dGhpcy5LYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm1jPSEwO3RoaXMuUmMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fApkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuVmY9dGhpcy5nYihkLnN0cmljdCk7dGhpcy4kZD10aGlzLmdiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlJnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5hYj10aGlzLmdiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5nYihkLmVuYWJsZWQpO3RoaXMuVWI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5XYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmFkPWQudGVzdGFkdGFnc3hocnx8CltdO3RoaXMuc2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMub2I9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5kYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucGQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuY2Y9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuaGI7dGhpcy5KZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnNkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy4kZj1kLnZtYXBzfHwiIjt0aGlzLkRjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmVpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5qZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5YZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMua2I9CmQueWllbGRsYWJ8fG51bGw7IXRoaXMubWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1jPSEwLHRoaXMuUmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT28oKSYmKHRoaXMuVWJ8fHRoaXMuV2J8fHRoaXMuVmJ8fHRoaXMuYWQpP3RoaXMud2Y/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLkJiKSksdGhpcy5CZSgpLHRoaXMuWWIoKSk6dGhpcy5HbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlJmKCkpfX0sWG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSksYj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6Yixob21hZF91cmxfc3VmZml4X2Jhc2U2NDplLnBiKGIpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07ZS5RYyh0aGlzLnBjKCksIlBPU1QiLGIsZnVuY3Rpb24oYil7dHJ5e3ZhciBhPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXt9ZS50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghYXx8IWEubGVuZ3RoKSwhMCk7dHJ5e2EmJmEubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlciYmKHRoaXMub2IrPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihhWzBdLmlkKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgYT0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuWSgxMCksaD1lLlkoMTApLEI9ZS5ZKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwpiKEIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKStiKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnBiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUuQWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApOwpyZXR1cm59dGhpcy5zYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sUmY6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKTt0aGlzLlliKCl9LCRjOmZ1bmN0aW9uKGIsYSl7dGhpcy53Yz0hMDt0aGlzLmtiJiYhdGhpcy5IaT8odGhpcy5YbSgpLHRoaXMuSGk9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoYixhKX0uYmluZCh0aGlzKSw1MDApKTp0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIoYikpLHRoaXMuWWIoKSx0aGlzLkJlKCkpfSxGbzpmdW5jdGlvbigpe2lmKHRoaXMuVWIpe3ZhciBiPWUuQWQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkptKCkpdGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7CnRyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVWIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5VYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChnKXt9Yj90aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm5pKCl9fWVsc2UgdGhpcy5uaSgpfSxQZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuUWIoKSksdGhpcy5LbyhnLAowPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLk9mLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLk9mKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5WYj10aGlzLmFkKSYmdGhpcy5WYi5sZW5ndGgpe3ZhciBkPXRoaXMuVmIuc2xpY2UoKSxnPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5PZigpfSxLbzpmdW5jdGlvbihhLGYsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5RYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5QZi5iaW5kKHRoaXMpLGYuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5QZigpfX1mdW5jdGlvbiBmKCl7dGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLldiJiZ0aGlzLldiLmxlbmd0aCl7dmFyIGQ9dGhpcy5XYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlBmKCl9LExvOmZ1bmN0aW9uKGEsZixkKXtmdW5jdGlvbiBnKCl7ZSgpJiZmKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZil7Zj09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sT2Y6ZnVuY3Rpb24oKXtpZih0aGlzLnNjKXRyeXtlLlFjKHRoaXMuc2MsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRmI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5SZigpfS5iaW5kKHRoaXMpLHRoaXMubGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5saSgpfWVsc2UgdGhpcy5SZigpfSxsaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpO3RoaXMuWWIoKTt0aGlzLkJlKCl9LEptOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApZYjpmdW5jdGlvbigpe3ZhciBhPSIwIixmPSIwIjt0cnl7ZS5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLndjJiYoZj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitmLCEwKTsodGhpcy5DYSYmdGhpcy5pc0VuYWJsZWQmJmUuRCgiY2hpcC5kZSIpfHxlLkQoImZvY3VzLmRlIikpJiZ0aGlzLmNsKCk7dGhpcy5zYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkZiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5oZSkpO3RoaXMuYmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5iZSYmdGhpcy5iZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5GYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuV2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5XYy5pZD1lLlkoMTApO3RoaXMuV2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLldjKTt2YXIgYT0KdGhpcy5XYy5jb250ZW50V2luZG93LGY9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Quc3JjPSJodHRwczovL3Vwcy54cGxvc2lvbi5kZS9sb2FkZXIvOTE2MjgvZGVmYXVsdC5qcz94cGxyZGlyPTEiO2EuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKTtmLnNyYz1lLnllKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZS50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sCm9sOmZ1bmN0aW9uKCl7aWYodGhpcy4kZCYmdGhpcy5vbSgpKXt2YXIgYT10aGlzLllsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxzaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZixkLGcsYyxoKXt0aGlzLkdkfHwodGhpcy5HZD0wKTt0aGlzLkdkKys7dGhpcy5HZD50aGlzLnBoJiYhdGhpcy5xaCYmKHRoaXMucWg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLnBoLCEwKSk7YT1uZXcgTWEoYSxmLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpOwpnJiYoYS5HaT0hMCk7YyYmZS5IbSgpJiYoYS4kZz0hMCk7aCYmKGEua2k9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLmFufHwodGhpcy5hbj0hMCxlLkRhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhmPWEucmVzcG9uc2VYTUwpfHwoZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJgpnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlBjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1lLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGYpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLiRmfSxtbDpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hcC5iaW5kKHRoaXMpLHRoaXMuJG8uYmluZCh0aGlzKSl9LGFwOmZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsO3RyeXsoZj1hLnJlc3BvbnNlWE1MKXx8KGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5JbCgpfSwkbzpmdW5jdGlvbigpe30sSWw6ZnVuY3Rpb24oKXtlLkpjKGsuSGwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEJlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09Zi50eXBlJiZlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWYudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LE9vOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGR9LFFiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGY9IiIsZD0wO2Q8YTtkKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGZ9LGdiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PQphfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGY9IiIsZCxnLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZj1mKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspOwpyZXR1cm4gZn0sYWE6ZnVuY3Rpb24oYSl7dmFyIGY9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtmW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixmKXtiJiYoZC5xdWVyeUtleVtiXT1mKX0pO3JldHVybiBkfSxIZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBmKGEpe3ZhciBiPQoiIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsYis9Zi50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWVbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyllW2ddPWQoZVtnLTNdXmVbZy04XV5lW2ctMTRdXmVbZy0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnF8biZyfHEmcikrdStlW2ddKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihmKGgpK2YoaykrZihsKStmKG0pK2YodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnVqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLkJrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZixkKXt0aGlzLmE9CmE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5iaS5iaW5kKHRoaXMpLG11dGU6dGhpcy5sZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEucmI7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5pYz10aGlzLnFkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zjt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5VZD17fTtlLnViKCJuZXdCaWdBZElkIik7dGhpcy5hbD1lLlkoMTApO3RoaXMuTGY9MDt0aGlzLm5kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMubmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMubmQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYKInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVWM9dGhpcy5UZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy51ZT0hMTt0aGlzLnZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubmM9ITE7dGhpcy56bD1lLlkoMTApO3RoaXMuUGI9ZS5ZKDEwKTt0aGlzLk5iPWUuWSgxMCk7dGhpcy5naT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmNlPXRoaXMuWmI9dGhpcy5GZT10aGlzLnhkPXRoaXMuVmQ9dGhpcy5BYj10aGlzLnVjPXRoaXMuUGg9dGhpcy5FZT10aGlzLkNkPXRoaXMuUG89dGhpcy5EYj10aGlzLk9iPSExO3RoaXMuemM9W107dGhpcy5vYz17fTt0aGlzLnRuPTIwMDt0aGlzLmNnPXRoaXMuY2Q9dGhpcy5FYz10aGlzLmJnPXRoaXMudmY9ITE7CnRoaXMubmY9e319Yy5vaj1hO2EucHJvdG90eXBlPXskbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGY9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBmfSx0aTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5MYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMud28oKTtlLm8oay5Kayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmZjpmdW5jdGlvbihhLGYsZCxjKXt0aGlzLkRiPWQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQS5TKXRoaXMuTGYrKyxlLnViKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxjPW0uZ2V0Q29uZmlnKCksZS5HZSYmKHRoaXMuQS5hbyh7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksCmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy50aSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpmLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpmPyh0aGlzLnRpKCksbmV3IFModGhpcyxhLHRoaXMuR2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaGIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB3Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3Yy5mZihhLGYsZCl9LDUwKX19LHJmOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5jZT10aGlzLlpiPXRoaXMuRWU9dGhpcy5DZD0hMTt0aGlzLmI9YTt0aGlzLnFvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLnpjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5VZD10aGlzLmltKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBmPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGY9dGhpcy5iaChiLnBhcmVudCkpLGYucHVzaCh0aGlzLlNsKGIpKSk7CnJldHVybiBmfSxTbDpmdW5jdGlvbihhKXt2YXIgZj0iIixkPVtdO2lmKGEmJmEuTCYmYS5MLmdldEF0dHJpYnV0ZSl7Zj1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmYsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGY9W10sZD1bXSxjPVtdLGU9W10saD0iIjtpZihhLkwpe2Y9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPQowO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKWQucHVzaChhLnNiKGZba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGY9YS5lcnJvci5kZXRhaWwuY29kZSksYS56ZCYmYS56ZC5lcnJvciYmYS56ZC5lcnJvci5jb2RlJiYoZj1hLnpkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZWQuY29kZTpmPT1GLmxlLmNvZGU/ZS5vKGsudnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnUoKSk6KGUuZ2YoKSxmPT1GLmdnLmNvZGUmJmUubyhrLmduLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpO2UubyhrLkdsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54bygpO3RoaXMuV2EoImVtcHR5Iik7dGhpcy5BLkZiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRmIsITApO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLmJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaGcuY29kZTplLm8oay53cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5tZS5jb2RlOmUubyhrLnhwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTsKYnJlYWs7Y2FzZSB2LmllLmNvZGU6ZS5vKGsuaG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB2LmZlLmNvZGU6ZS5vKGsuWW8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB2LmRnLmNvZGU6ZS5vKGsuWm8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMuamMoYSk7dGhpcy5RYSgpfSxqYzpmdW5jdGlvbihhKXt2YXIgZj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZj1hLmVycm9yLmNvZGUsOTAxPGYmJihmPTkwMCkpO2ZvcihmPXsiW0VSUk9SQ09ERV0iOmZ9O2EuT2EubGVuZ3RoOyl0cnl7dmFyIGQ9YS5PYS5wb3AoKTt0aGlzLmVmKGQudXJsLGQudHlwZSxmKX1jYXRjaChjKXt9fSwKcW86ZnVuY3Rpb24oYSl7dGhpcy5GZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuR2YodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihmPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9ZjtmPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2QmJmQuZW52dmFycyYmKGM9ZC5lbnZ2YXJzKCkpO2MudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRWQmJihjPWQuRWQoKSk7Yy52aWRlb1Nsb3QmJihmPWMudmlkZW9TbG90LHRoaXMudmY9ITApfWNhdGNoKGgpe31mLnhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihmLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pOwppZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmYuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuU2smJnRoaXMucGxheWVyLk1lKCkmJihmLnZvbHVtZT10aGlzLnBsYXllci5NZSgpLzEwMCk7Zm9yKDtmLmZpcnN0Q2hpbGQ7KWYucmVtb3ZlQ2hpbGQoZi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZi5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZixhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnZmJiZmLmxvYWQoKTtpZih0aGlzLm9pKGYpKXt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGYpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMudmY/dGhpcy52aWRlbz1mOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChmKX1jYXRjaChsKXt0aGlzLnZpZGVvPWZ9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZiksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxvbzpmdW5jdGlvbigpe3RoaXMuYmc9ITA7CnRoaXMuQWI9dGhpcy51Yz0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5BYj0hMCk7ZS5DZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5vYSYmZS5Sayh0aGlzLmIub3JpZ2luLm9hKTt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlFoKCk7dGhpcy5hLklmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5JZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5HZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy56aSgidnBhaWQiKTsKaWYodGhpcy5BYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlNiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfXRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7CnRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5HZih0aGlzLkYsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkYub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMua2EmJnRoaXMuYS5jLmthKCkmJihhPSEwKTt2YXIgYj10aGlzLmIubG0oKSxjPXRoaXMuYi5zLk9yaWdpbmFsQWRQYXJhbWV0ZXJzO2lmKGImJmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgaD10aGlzLkEuZ2V0Q29uZmlnKCk7aCYmaC5hZEZhbGxiYWNrQ29uZmlnJiZoLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihjPUpTT04uc3RyaW5naWZ5KGguYWRGYWxsYmFja0NvbmZpZykpfXZhciBrPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLAphZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5sYSh0aGlzLkYsImNvbmZpZyIsayk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsCiJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnllKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7ZS53ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5HYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuemM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5qcChhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLmtwKCksdGhpcy5hLmxjKCEwKSwhdGhpcy5aYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5aYj17ZWw6dGhpcy5GLApjYjpmdW5jdGlvbigpe3RoaXMuY2U9ITA7ZS5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuWmUodGhpcy5aYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmxjKCEwKSx0aGlzLm9wKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5sYyghMCksdGhpcy5zcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ycCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnRwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnBwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkVpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5xYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkEuRGN8fHRoaXMuY2QpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5jZCYmKHRoaXMuY2c9ITEsdGhpcy5yYygpKSx0aGlzLm1wKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuQWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlNiKCJtdXRlZCIsInVzZXIiKSxlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5BYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuU2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuVGYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsuc2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7ZS53ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLndlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnhnKGZ1bmN0aW9uKGEpe2UubGEodGhpcy5GLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sbHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnVjPSEwfSxtcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmxkLHRoaXMuYi5zLAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudWM9ITF9LG9wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsudGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuc2csdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5paSgpO2UubyhrLm9nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2UubyhrLmxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuQ2Q9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmxnLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxycDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSx0cDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0scHA6ZnVuY3Rpb24oKXt0aGlzLlhmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sRWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGY9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZik7CmUuQ2UoKTt0aGlzLkY9ITE7dGhpcy5RYShhKX19LGpwOmZ1bmN0aW9uKGEpe3ZhciBmPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWYmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGY9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGYubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTtlLm8oay51cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuRWkoITApfSxOazpmdW5jdGlvbihhLGYpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUGMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChmLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuZ3AuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoZix0aGlzLkEpKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFFrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuWmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sUGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuQmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5aZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5pY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljfHx0aGlzLlpmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWWspKX0sWmY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWQmJnRoaXMub2kodGhpcy52aWRlbykmJiF0aGlzLk9iJiYhdGhpcy5pYyl7dGhpcy5xZD0hMDt0cnl7aWYoIWUuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuT2J8fCh0aGlzLk9iPSEwLHRoaXMuUGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5ZYSgpLCEwKSx0aGlzLkEuUmd8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChmKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLmVwKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuSWYoKTt0aGlzLmNwKCk7dGhpcy56aSgpO3RoaXMuQWcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuTWYoKX19LE1mOmZ1bmN0aW9uKCl7dGhpcy54ZHx8dGhpcy5tZygpfSxtZzpmdW5jdGlvbihhKXt2YXIgZj10aGlzLnZpZGVvLnBsYXkoKTtpZihmJiZmWyJjYXRjaCJdKWZbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnhkfHwoYT90aGlzLlFhKCk6KHRoaXMubGYoITApLHRoaXMubWcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMudWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk1mKCkpfS5iaW5kKHRoaXMpO3RoaXMuT2UoKS5maSh0aGlzKX0sWGY6ZnVuY3Rpb24oKXt0aGlzLkEuYWImJiF0aGlzLk9iJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWGEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5FZT0hMDtlLm8oay5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUWEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBmPVtdLGQ9ITEsYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZS5naChhW2NdKSxmLnB1c2goZCk7YT17aGFzaGVzOmZ9O2E9ay5TYShhLHRoaXMudSgpKTtlLnVvKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5lZSYmdGhpcy5Layh0aGlzLmIuZWUpOwppZighdGhpcy5GZSlpZih0aGlzLkZlPSEwLHRoaXMuY2V8fChlLm8oay5sbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5DYnx8dGhpcy5iLnhjKXtlLnViKCJuZXdTbWFsbEFkSWQiKTt0aGlzLkxmKys7dGhpcy5pYz10aGlzLnFkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGYpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnhpKCl9Y2F0Y2goaCl7fXRoaXMuVmQ9ITA7dGhpcy5hLlNlKCk7dGhpcy5uYz0hMTt0aGlzLk9lKCkuJGgoKTt0aGlzLmIuQ2ImJnRoaXMuYi5vcmlnaW4ubWYoKTt0aGlzLmIueGMmJihhP3RoaXMuYi5vcmlnaW4uSmgoKTp0aGlzLndkKCkpfWVsc2UgdGhpcy53ZCgpfSwKZ3A6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLllmKGEpKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5pYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTt0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxDaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5RYSgpO2Vsc2V7dGhpcy5uYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkdjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5UbyhhKTtpZighdGhpcy5aYil7dmFyIGY9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGY9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlpiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5jZT0hMDtlLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmYscGVyY2VudDpkLHN0YXJ0VGltZTohMX07ZS5aZSh0aGlzLlpiKX1kPSIiO3RoaXMuYi5LZiYmKGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5naSkpJiYoZD10aGlzLmIuS2YtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIiwKZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlRkfHwodGhpcy5UZD0hMCxmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5zZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5DYj8odGhpcy5pYz10aGlzLnFkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmliLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEueGkoKSx0aGlzLmIub3JpZ2luLm1mKCkpOnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxmLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMubmQucmVwbGFjZSgiW3RpbWVdIixlLmFoKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudWU9ITA7CnRoaXMudmlkZW8uY29udHJvbHM9ITF9fSx1aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuQ2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxUbzpmdW5jdGlvbihhKXtlLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudml8fHRoaXMuT2J8fCgwPT1hJiYodGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMuQS5GYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuRmIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy51aSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMudWkoKX0uYmluZCh0aGlzKSksdGhpcy5PYnx8CnRoaXMuaWkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5hYiYmdGhpcy5YYSgic3RhcnQiKSxlLm8oay5vZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGUubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMuQ2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLm8oay5sZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLAplLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy52aT1hKX0saGk6ZnVuY3Rpb24oYSxmKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsZiwhMCl9LHdvOmZ1bmN0aW9uKCl7ZS5iZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxpaTpmdW5jdGlvbigpe2UuYmQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtlLmJkKFsic3RhdHNfaGRfYWRfZW1wdHk6IisKdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2UuYmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuYmd8fHRoaXMuQS5hYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxTYjpmdW5jdGlvbihhLGYpe3RoaXMuQS5hYiYmZS50cmFjaygic3RhdHNfaGRfIithLGYsITApfSx0cmFjazpmdW5jdGlvbihhLGYpe2lmKCF0aGlzLk9iKXt0aGlzLm5mJiZ0aGlzLm5mLnRyYWNrJiZ0aGlzLm5mLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZS5HZSYmZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09CiEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5FYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlVkLmltcHJlc3Npb25zJiZlLkZtKGgudXJsLHRoaXMuVWQuaW1wcmVzc2lvbnMpP3RoaXMuZWYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UubyhrLklrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5lZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZil0cnl7dGhpcy5iLk9hPXRoaXMuQ2wodGhpcy5iLk9hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsCmY9IiI7dGhpcy5iZyYmKGY9Il92cGFpZCIpO3RoaXMuY2QmJihmPSJfd2VsZWN0Iik7cmV0dXJuIGErZn0sZWY6ZnVuY3Rpb24oYSxmLGQsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZj10aGlzLkEud2EoYSksZCYmZi5NayhkKSxjfHwoYz10aGlzLlFnKSxlfHwoZT10aGlzLlFnKSx0aGlzLk9rKGEpLHRoaXMuQS5LYShmLGZ1bmN0aW9uKCl7dGhpcy5aaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlpoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxPazpmdW5jdGlvbihhKXt0aGlzLm9jW2FdPSJvcGVuIn0sWmg6ZnVuY3Rpb24oYSl7dGhpcy5vY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLm9jPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZjtmb3IoZiBpbiB0aGlzLm9jKXRoaXMub2MuaGFzT3duUHJvcGVydHkoZikmJiJvcGVuIj09dGhpcy5vY1tmXSYmYSsrO3JldHVybiBhfSxqbTpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0KZn0pfSxDbDpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Zn0pfSxlcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2Eud2cmJmEud2codGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGUuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMucmMoKTtlbHNlIGlmKHRoaXMuYi5xYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5EZXx8KHRoaXMuYi5EZT0xKTtpZigxMDA+YS10aGlzLmIuRGUpcmV0dXJuO3RoaXMuYi5EZT1hfWNhdGNoKGYpe31lLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQoiX3RvcCI7aWYodGhpcy5BLkRjfHx0aGlzLmNkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnFifWNhdGNoKGYpe2E9d2luZG93Lm9wZW4odGhpcy5iLnFiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX19fS5iaW5kKHRoaXMpLDUwMCl9fSxjcDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5uZC5yZXBsYWNlKCJbdGltZV0iLGUuYWgoMCkpO3ZhciBmPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5zZCYmKGY9dGhpcy5BLnNkKTtmJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhiLmJpbmQodGhpcyksMUUzKmYpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5zZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sClJkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEuc2QpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZS5OZih0aGlzLmNvbnRyb2xzKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuUGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucmkuYmluZCh0aGlzKSksZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5yaS5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnBpLmJpbmQodGhpcykpLGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLk5iO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmdpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLktmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLndpZHRoPSIxMDAlIixmLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixmLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixmLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixmLnN0eWxlLmJvdHRvbT0iMHB4IixmLnN0eWxlLnpJbmRleD0iMTAwMDAiLGYuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGYpO3RoaXMuYS54ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5sZigpKTt0aGlzLkliKCl9fSxJYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHJjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmNnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpKX0scmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnVjPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudWM9ITEpOihlLmxhKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy51Yz0hMCl9LExkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuU2IoIm11dGVkIiwidXNlciIpLGUubyhrLkpkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpOwp0aGlzLkFiPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5TYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxxYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYyk7dGhpcy54ZHx8dGhpcy51ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTWYoKSl9LHdkOmZ1bmN0aW9uKCl7dGhpcy5PbSgpJiZ0aGlzLk5tKCkmJih0aGlzLkEud2N8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuTGImJnRoaXMuVW8oKXx8KHRoaXMueGQ9ITAsdGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy5MZygpKX0sT206ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCk7aWYoIXRoaXMuQS5oYnx8ZS5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGY9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuRGEoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZitkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuVWN8fChhPQohMCxmLmFkRmFsbGJhY2tVUkx8fChmLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkVjJiZmLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5VY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRWM/ImFueSI6IiIpKyhmLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5VYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRWMmJmYuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlVjfSxabDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxmPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1mLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmYuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1lLnllKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5mZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy53ZCgpfXZhciBmPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWmwoKTt0aGlzLkVjPXRoaXMuVWM9dGhpcy5jZD10aGlzLmNnPSEwO3JldHVybiBmPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2YsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy50bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlNlKCksdGhpcy5hLlluKCksdGhpcy5uYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkVlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5PZSgpLiRoKCkpfSxPZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxBZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLlllKHRoaXMudmlkZW8sYSk/dGhpcy5iaSgpOnRoaXMuTGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5xYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5DYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy56YyYmMDx0aGlzLnpjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy56YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5hbCsiLSIrdGhpcy5MZjt0aGlzLmImJnRoaXMuYi5oaCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuaGgoKSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5sa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtmPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlg9W107dGhpcy5MPW51bGw7dGhpcy55Yz10aGlzLkFjPSExO3RoaXMub2E9IiI7dGhpcy5hZz0hMTt0aGlzLnNoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGYsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZj1mdW5jdGlvbigpe3JldHVybiBjKCkmJihlLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRCgiZmFuZG9tLmNvbSIpfHxlLkQoImdpZ2EuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGMoKXx8ZigpKXt2YXIgaD1lLk5nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGY9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuRCgiZ2lnYS5kZSIpfHxlLkQoImtpbm8uZGUiKXx8ZS5EKCJzcGllbGV0aXBwcy5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZigpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1kKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLldkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5LYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxkaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkxiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChmKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5MYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuTGJ8fHRoaXMuTG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0uRW8oKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sTG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2M9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksYz1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkduKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLnNoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWC5sZW5ndGgpdGhpcy5UYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuZWQse2Vycm9yOnRoaXMuYWc/Ri5sZTpGLmZnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGQpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLlgubGVuZ3RoP3RoaXMuVGMoKTp0aGlzLnJhKHRoaXMuUmEodi5lZCx7ZXJyb3I6dGhpcy5hZz9GLmxlOkYuZmd9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuZWcse2RlcHRoOmJ9KSl9LFRjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWC5zaGlmdCgpO3RoaXMuUG0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubWgoKSxmLHtBZFN5c3RlbTp0aGlzLlJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmhnKSk6KGI9MCx0aGlzLldvKCkmJnRoaXMucmYodGhpcy5CbCgpKSl9LG1mOmZ1bmN0aW9uKCl7dGhpcy5BYz8odGhpcy5BYz0xPHRoaXMuWC5sZW5ndGgsCnRoaXMuWC5sZW5ndGgmJnRoaXMuVGMoKSk6dGhpcy5wYXJlbnQubWYoKX0sSmg6ZnVuY3Rpb24oKXt0aGlzLnljPyh0aGlzLnljPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLlRjKCkpOnRoaXMucGFyZW50LkpoKCl9LFdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLktjKCk/dGhpcy5yYSh0aGlzLlJhKHYuZmUpKTp0aGlzLnJhKHRoaXMuUmEodi5kZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuZWQsRi5nZykpLCExKX0scmY6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuZWV8fChhLmVlPVtdKTthLmVlLnB1c2godGhpcy5zaCk7YS5PYT1hLk9hLmNvbmNhdCh0aGlzLmhmKCkpO2EuQ2I9YS5DYj9hLkNiOnRoaXMuQWM7YS54Yz1hLnhjP2EueGM6dGhpcy55YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWmc7dGhpcy5wYXJlbnQucmYoYSl9LApCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLktjKCk7YS5PPXRoaXMuamgoKTthLnFiPXRoaXMuVWwoKTthLkVxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUWwoKTthLktmPXRoaXMuaG0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpkLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGMpe319dGhpcy5MJiYoYS5PYT1hLmVycm9yLmNvZGUhPXYuZmUuY29kZT9hLk9hLmNvbmNhdCh0aGlzLlZsKCkpOmEuT2EuY29uY2F0KHRoaXMuZG0oKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5qYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmpjJiZ0aGlzLnBhcmVudC5qYyhhKSxiPTAsdGhpcy5UYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGpjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmpjKGEpfSxUZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxNbzpmdW5jdGlvbigpe3JldHVybiBiPApmfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuamgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5LYygpfSxRZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LG1pOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5RZigpJiYoYT0hMCk7cmV0dXJuIGF9LEduOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5hZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxQbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLm1oKCkubGVuZ3RofSxtaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5lKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFJsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmUodGhpcy5MLCJBZFN5c3RlbSIpfSxoZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1jJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fAphLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnpoKGEpKXt2YXIgZj1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Yy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpmLHVybDp0aGlzLnNiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxWbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmpoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFpwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnNiKGFbZF0pfSk7dmFyIGM9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGI9Zi5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxRbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixkPSExLGM9W10sYj0hMSxmPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Y9Yj10aGlzLkZkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWMucHVzaChkKTtlLnB1c2goZil9MTxhLmxlbmd0aD8oYj1jLGg9Zik6KGI9ZCxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxLYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnNiKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGhtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsYz0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGM9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUudG8oYyxhKSwwPmImJihiPSExKX1jYXRjaChmKXtiPSExfXJldHVybiBifSxOZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuc2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxzYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkZkKGEpOiIifSxGZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5RZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5QaXx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk89W107dGhpcy5xYj0iIjt0aGlzLnM9dGhpcy54Yz10aGlzLkNiPSExO3RoaXMuVWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlZlPSIifWMuVmo9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5PLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sYm06ZnVuY3Rpb24oKXtpZighdGhpcy5VZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm5hKXt2YXIgYT10aGlzLm9yaWdpbi5uYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5VZT1hW2RdKX1yZXR1cm4gdGhpcy5VZX0saGg6ZnVuY3Rpb24oKXtpZih0aGlzLlZlKXJldHVybiB0aGlzLlZlO3ZhciBhPSIiOyhhPXRoaXMuYm0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlZlPWF9LGxtOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2NdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Wanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5PaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXttZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixOYToiWE1MX1BBUlNFX0VSUk9SIn0sZGc6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGVkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGhnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApOYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTmE6IkxPQURfRVJST1IifSxpZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKenA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTmE6Ik1FRElBRklMRV9FUlJPUiJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE5hOiJEVU1NWV9BRCJ9fSxGPXtmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE5hOiJOT19BRFMifSxnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTmE6Ik5PX01FRElBRklMRVMifSxBcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGxlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Laj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBXYT1jLktqfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnpkPWM7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmRqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLk5sfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuYWk9YTt0aGlzLnZpZGVvPWM7dGhpcy5hZT1bXTt0aGlzLlloPVtdO3RoaXMub2Y9W107dGhpcy5mcD0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLkJwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYWkubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5haVthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLnRxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Wbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Nbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuYWUucHVzaCh7c3JjOmQsZnJhbWU6aCx2bjplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5vZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLm9mW2NdO2QudHlwZT09PWEmJmQuZmwodGhpcy5XbChhKSl9fSwKV2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7Q3E6ITAsQnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7cXE6InZpZGVvIixGcToianNDdXN0b20iLEdxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsSHE6MSwkcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LAprbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuYWUubGVuZ3RoO2MrKylpZih0aGlzLmFlW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYWVbY10udm47cmV0dXJuIiJ9LFZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5ZaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5rbShjKSx2ZW5kb3I6Y30pO3RoaXMudm8oKX0sTW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLmZwLm1hcChmdW5jdGlvbihhKXt0aGlzLnlnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMueWcoYSxjKX0seWc6ZnVuY3Rpb24oYSxjKXt0aGlzLm9mLnB1c2goe3R5cGU6YSxmbDpjLHpxOiExfSl9LHZvOmZ1bmN0aW9uKCl7dGhpcy5ZaC5tYXAoZnVuY3Rpb24oYSl7YS5JbXx8KGEuc3Eoe2FkU2Vzc2lvbklkOmUuWSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuRHEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5JbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLlhrfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLnJiPWEuZWgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWSgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy56Zz0hMTsKdGhpcy5lYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxDbzpmdW5jdGlvbigpe3RoaXMuemc9ITB9LHhpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkdjLHRoaXMuYy5sKCkpfSxZbjpmdW5jdGlvbigpe3RoaXMuemd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay52ZCx0aGlzLmMubCgpKSl9LElmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnJiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5yYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLnJiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMucmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5yYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5yYik7CnRoaXMuYy5YYyYmdGhpcy5jLlhjKCk/dGhpcy5jLmVoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sc206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGxjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5yYik7aWYoYy54IT10aGlzLkhhLnh8fGMueSE9dGhpcy5IYS55fHxjLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLkhhLndpZHRofHxjLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuU2UoKTtyZXR1cm59dGhpcy5IYT1jO3RoaXMuYy5YYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmVjLmxlbmd0aDthKyspdGhpcy5lY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLk5mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGMuYmluZCh0aGlzKSwxMCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLmVjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5lYy5wdXNoKGEpfSxTZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ybj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMucm58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5PZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sT2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGJiPWMuUGp8fGJiOyhmdW5jdGlvbihjKXtjLk9qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuYmM9dGhpcy5iY3x8ITE7dGhpcy5wZz10aGlzLnJnPQp0aGlzLndoPXRoaXMudmE9dGhpcy5TZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5TZj0hMDt0aGlzLndoJiZ0aGlzLkdnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuS2I7YSYmYS5uYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpOwp0aGlzLkNnKCl9LEdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmMpe3RoaXMudGQoKTtpZighdGhpcy5TZiYmIXRoaXMudGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlNmJiZ0aGlzLnBnJiYhdGhpcy5yZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19LHRkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxraDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxDZzpmdW5jdGlvbigpe2lmKHRoaXMudGQoKSl7dmFyIGE9CnRoaXMua2goImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5yZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnBnPWEuWHB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2coKX0uYmluZCh0aGlzKSwxMDApfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5vcSgpOiExfSxLYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuS2MoKTotMX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sS2w6ZnVuY3Rpb24oYSxiKXt0aGlzLmJjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLmJjfHwzMDI9PXRoaXMuYmM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuYmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuV2UoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5lbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBjYj1jLk9qfHxjYjsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEttOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlpqLkZrLkRrP3dpbmRvdy5PTy5aai5Gay5Eay5WcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5QZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGNiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlFqfHxkYixlYj1uZXcgZGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5FbHx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5uaCgpfSxuaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE1hOmZ1bmN0aW9uKCl7dGhpcy5UaCgpfSxUaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVml8fGdiOyhmdW5jdGlvbihjKXtjLlVpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRGcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlVpfHxoYjsoZnVuY3Rpb24oYyl7Yy5XaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFdoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLldoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5XaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLldpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLldrfHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5paz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxYYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuaWt8fFU7KGZ1bmN0aW9uKGMpe2MuaGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5tZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp3Lm1kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubm4oYSl9LmJpbmQodGhpcykpO3cubWQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5tZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0sbm46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5pYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLktkJiYoYT1lLkRsKGEsdGhpcy5LZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk0oZCkpe3RoaXMuTihkKTsKdmFyIGc9bmV3IFYoZCx0aGlzLkcpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLktkfHwodGhpcy5LZD1bXSksdGhpcy5LZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGc9bmV3IFYoZCx0aGlzLkcpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbWQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0sTm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5TY3x8Cih0aGlzLlNjPVtdKSx0aGlzLlNjLnB1c2goYSksdGhpcy5YbigpJiYodGhpcy55ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuU2MpZm9yKHZhciBhPTA7YTx0aGlzLlNjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuU2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5ObyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Tbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMuU298fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5SaXx8bWI7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuU2l8fApuYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuTShoKXx8KHRoaXMuTihoKSwobmV3IG5iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlRpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5ra3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLkljPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9CiEwKTt2YXIgYj10aGlzLlZnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5JYz1iKTtpZighdGhpcy5JZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRWQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVihiKTt0aGlzLkxuKHRoaXMuZ2V0UmF3UGxheWVyKCksCmEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHdnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTt0aGlzLmdjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5nYyYmdGhpcy5nYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdHJ5e3RoaXMuZ2NbYV0oKX1jYXRjaChiKXt9fSxFZDpmdW5jdGlvbigpe2lmKHRoaXMuSWMpcmV0dXJuIHRoaXMuSWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVmcoYSkpcmV0dXJuIHRoaXMuSWM9YX19LFZnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxMbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCwKZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS51bm11dGUmJgp0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0seGg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Nanx8cmI7KGZ1bmN0aW9uKGMpe2MuTGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5FZCgpP3RoaXMuQygpOih0aGlzLkhlfHwodGhpcy5IZT0xKSx0aGlzLkhlKyssMTAwPHRoaXMuSGU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Manx8c2I7KGZ1bmN0aW9uKGMpe2MuTmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyBzYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Oanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy5ranx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sCk1hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudmt8fHZiOyhmdW5jdGlvbihjKXtjLnVrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxKbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPQpbXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5CYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkpuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuTWMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7CnJldHVybn1pZighdGhpcy5CYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudWt8fHdiOyhmdW5jdGlvbihjKXtjLndrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTsKdGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgd2IoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMud2t8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLndtfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5zZj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTAwKX0sQW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5XJiZ0aGlzLlcoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx5bzpmdW5jdGlvbigpe3RoaXMuc2Y9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudGM9MH0sZjpmdW5jdGlvbigpe3RoaXMuJG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnRjfHwodGhpcy50Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy50Y3x8dGhpcy50YysrLHRoaXMudGM8PXRoaXMuJG0/KHRoaXMudGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnlvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQmI9Yy5ja3x8QmI7KGZ1bmN0aW9uKGMpe2MuZWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkcpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy55cHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5HYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUW0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm5nKCl8fHRoaXMuaSghMCl9LFFtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HYigpOyFhLnBhJiZhLlgmJmEuVXAmJmEuV3AmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2IoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZmQuR2IoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXS5pZD09YiYmKHRoaXMuTmg9YVtmXSk7cmV0dXJuIHRoaXMuTmh9LHBxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5HYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5mZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmZkLkdiKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmZkLkdiPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5mZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5wbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMucG58fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVihiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxucTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApYYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Ianx8WDsoZnVuY3Rpb24oYyl7Yy5Haj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnRmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMudGYmJmMhPXRoaXMudGZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuRCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEudXEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkdqfHxZOyhmdW5jdGlvbihjKXtjLklqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy55ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLklqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLk5pfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlYoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sZGk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGtuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0sQWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5BZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE9iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMudW58fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLllpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVihiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxkaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxrbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLllpfHxTYjsoZnVuY3Rpb24oYyl7Yy5aaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkFlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWml8fFRiOyhmdW5jdGlvbihjKXtjLiRpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgU2IoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBUYihjLHRoaXMuRykpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuJGl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLnFufHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlYoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxLbjpmdW5jdGlvbigpe3RoaXMuZGQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5kZHx8KHRoaXMuZGQ9ITAsdGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZGQmJih0aGlzLlpkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZGQ9ITEpLHRoaXMuWmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLnprfHxYYjsoZnVuY3Rpb24oYyl7Yy55az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmZjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5mYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGguYmluZCh0aGlzKSwxMCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuR2s9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkdrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxrZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5mYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2cuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5YaCgpO3RoaXMua2coKTt0aGlzLk5uKCl9LE5uOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuSG4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuSG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5mYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy55a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5LbigpLGE9bmV3IFliKGEsCnRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkFrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuVGt8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm5rPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZW49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGRpOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZZChhKX0uYmluZCh0aGlzKSl9LFlkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBOPWMubmt8fE47KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5MZSlpZih0aGlzLk1ifHwodGhpcy5NYj0wKSx0aGlzLk1iKyssMTU8dGhpcy5NYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5tbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLndiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5ta3x8TzsoZnVuY3Rpb24oYyl7Yy5vaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnlmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5va3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMueW58fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkNqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5WKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuQ2p8fFo7KGZ1bmN0aW9uKGMpe2MuQmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5PYz10aGlzLkJhPXRoaXMub2Q9ITE7dGhpcy5WaD1lLlFiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2IoKT8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkJqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Eaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkRqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy52bXx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVihiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5panx8aGM7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5oanx8aWM7KGZ1bmN0aW9uKGMpe2Muamo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmdhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmpqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Wa3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuemUoKTt0aGlzLkJnKCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemUuYmluZCh0aGlzKSwxMDApfSx6ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnplLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlVrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuTWQ9W107dGhpcy54Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5mbShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmNpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy54Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMueGZbZF07dGhpcy5XZihjKSYmKHRoaXMuTWQucHVzaChjKSx0aGlzLmNpKGMpKX19LFdmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0sZm06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMueGZbZF0sdGhpcy5XZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxjaTpmdW5jdGlvbihhKXt0aGlzLldmKGEpJiZhLmYoKX0sQW86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuTWQubGVuZ3RoO2ErKyl0aGlzLk1kW2FdLlhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTWRbYV0uWGIpfX19KShjKTt2YXIgcmM9CmMuWGp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuSmp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZS5KYyhrLlhvKSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5KYyhrLmpuKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHhjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksdmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbD0hMTtILmZhKCk7SC55aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnloKCksCmZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmEoKTt2YXIgeWM9eGMoZnVuY3Rpb24oKXtlLllnKHdpbmRvdyxILkFtKCkse2lkOnljfSl9LDUwMCksaWE9ZS5ZKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Daz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuQ2t8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5TaD10aGlzLmNvbmY9dGhpcy5KYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSWQ9MDt0aGlzLmViPSIiO3RoaXMuTmQ9W107dGhpcy5PZD0wO3RoaXMuVWg9ITE7dGhpcy51Zj1bXTtlLnViKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtpbzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPQphO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGNvOmZ1bmN0aW9uKGEpe3RoaXMuSmI9YX0sYm86ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gY30sWWM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuQm0oKSl0aGlzLkpiLmcodGhpcy5KYi5OYyx0aGlzLkpiLnFhLHRoaXMuSmIud2YsZnVuY3Rpb24oKXt0aGlzLlljKGEsYyl9LmJpbmQodGhpcyksdGhpcy5KYi5oYyk7ZWxzZSBpZih0aGlzLnBtKCkpdGhpcy5abihmdW5jdGlvbigpe3RoaXMuWWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkdjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLGw9Cm5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuQ28oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS51YigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBRYShsLHRoaXMuSmIsaCk7bC4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWm0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5kZiYmKGQ9dGhpcy5wbGF5ZXIuZGYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZmYoYSxkLGcpO3RoaXMucGxheWVyLmZpKGwpfX0sQm06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5JZClyZXR1cm4gYz1hLmdldFRpbWUoKS0KdGhpcy5JZC5nZXRUaW1lKCksdGhpcy5JZD1hLDNFNTxjPyEwOiExO3RoaXMuSWQ9YTtyZXR1cm4hMX0sc286ZnVuY3Rpb24oKXtlLnViKCJwcmVyb2xsIik7ZS5EZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlVnKGEpKT90aGlzLlljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlNoKXtlLkRmKCJwb3N0cm9sbCIpO2UudWIoInBvc3Ryb2xsIik7dGhpcy5pbyghMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7CihkPXRoaXMuVWcoZCkpP3RoaXMuWWMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9fSxVZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sUm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbyh0aGlzLnJvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk1hKCl9LFNkOmZ1bmN0aW9uKGEpe2UudWIoIm1pZHJvbGwiKTtlLkRmKCJtaWRyb2xsIik7aWYoIXRoaXMuSGgpe3RoaXMuSGg9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuWWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGg9CiExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnZkLHRoaXMucGxheWVyLmwoKSkpfX0sUW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmpmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLnNvKCk7dGhpcy5wbGF5ZXIuamYmJnRoaXMuUW4oKTt0aGlzLlJuKCl9LFNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGYpe3RoaXMuTmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmtiKGEsYixjLGYsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsCmFbY10ubWFjcm8pfXRoaXMuT2Q9dGhpcy5OZC5sZW5ndGh9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLk9kJiYoYT0hMCk7cmV0dXJuIGF9LFpuOmZ1bmN0aW9uKGEpe3RoaXMuVWg9YTtmb3IoYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fbi5iaW5kKHRoaXMpKX0sRW46ZnVuY3Rpb24oYSl7dGhpcy5PZC0tO2EmJnRoaXMudWYucHVzaChhKTswPj10aGlzLk9kJiZ0aGlzLlVoKCl9LFptOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLnVmLmxlbmd0aDtkKyspYz10aGlzLnVmW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLkxpfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucGt8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoeG9vU2VpaG9BY2hhYWNoaSx4b29TZWlob0FjaGFhY2hpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
13.224.194.16
Seattle, United States,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- server-13-224-194-16.fra2.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- d570e4900671048879eec90038e054c605437225d0c3a6c249d9ab2b6f95f89c
|
GET
H2
|
200
|
map
ih.adscale.de/
Frame 7986
|
0
0
|
39ms
39ms
|
Document
text/html |
18.185.150.7
AMAZON-02
|
|
|
GET
H2
|
200
|
launcher.js
Show response
sak.userreport.com/sdm/
|
64 KB
20 KB
|
163ms
63ms
|
Script
application/javascript |
13.225.73.76
AMAZON-02
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/b25d0cc577974cf5f6eaedf90b5df8f097d7b881/
|
257 B
1 KB
|
178ms
96ms
|
XHR
application/json |
136.243.90.4
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/b25d0cc577974cf5f6eaedf90b5df8f097d7b881/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHhvb1NlaWhvQWNoYWFjaGk9eG9vU2VpaG9BY2hhYWNoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucGZ8fCh3LnBmPTApO3cucGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5wZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZWEoKXtpZighbCl2YyhlYSw1MCk7ZWxzZSBpZighZS53bil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmRsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkdjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uQ2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5FZihjKTtiLmNvKG0pO2IuYm8obCk7Yi5TbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0uemIubGVuZ3RoKXt2YXIgYj1tLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGY7Zj1lLmxvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2ZbIltMT0FEU0NSSVBUXSJdXT1lLkZoLmJpbmQoZSk7d2luZG93W2ZbIltVVElMU10iXV09bTtmb3Iod2luZG93W2ZbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBmIGluIGIpbFtmXT1iW2ZdO3QoYyxhKX07Zj1iLnNjcmlwdHMuc2hpZnQoKTspZS5GaChmLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLkxiPSJzZXR1cCI7dGhpcy5aYz1bXTt0aGlzLkNlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRG4uYmluZCh0aGlzKSk7dGhpcy50Yj17fTt0aGlzLnJoPXt9O3RoaXMuQmY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy50Yil0aGlzLnRiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy50YlthXSsiXyIpO3JldHVybiBifSxrYzpmdW5jdGlvbigpe3RoaXMuQmZ8fCh0aGlzLkJmPWUuWSgxMCkpO3JldHVybiB0aGlzLkJmfSx1YjpmdW5jdGlvbihiKXt0aGlzLnRiW2JdfHwodGhpcy50YltiXT0wKTt0aGlzLnRiW2JdKz0xOzU8dGhpcy50YltiXSYmIXRoaXMucmhbYl0mJih0aGlzLnJoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxDZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxEbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5DbihiLmRhdGEpfSxDbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx3ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5RYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGdoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuT2woYikpcmV0dXJuOyhhPXRoaXMuTmcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxYZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sTW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZmg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sR2Y6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5BbChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9nPWNbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmdsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE5mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LEFoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFllOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZyk7Yz49YSYmKGU9ITApO3JldHVybiBlfSxaZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlllKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlplKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFFiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxSZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSGY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZis9Zy50b1N0cmluZygxNik7cmV0dXJuIGZ9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcD1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO3A9ZTtuPWg7bD16O3k9azt0PW07Zm9yKGc9MDsxOT49ZztnKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZz02MDs3OT49ZztnKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eitsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxwYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGc+PjQsZT0oZyYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZyk/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sSG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxBZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZWM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxwKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1wO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sWGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sdW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sUmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlFpKCl8fApiLlhpKCl8fGIudW0oKXx8Yi5SaigpfHxiLnhrKCl8fGIuRWooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuWmsoKX0sVGw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGYpe2EmJihkLnF1ZXJ5S2V5W2FdPQpmKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHA9Yi5sZW5ndGg7ZzxwOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxnbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LERsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxnLnB1c2goYltwXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocCl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sYWg6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy53aShhKSsiOiIrdGhpcy53aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sd2k6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LERmOmZ1bmN0aW9uKGIpe3RoaXMuTGI9Yn0sWWc6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5MYjt0aGlzLnRlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChwKXt0aGlzLnduPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEpjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5ZZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxwLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtwJiYoeD1rLlNhKHgscCkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtlLkpjKHgpfSxGbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5rYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudGUoYil9LHRlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRm4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0ucGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLkthKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bS5wYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShnLCEwKTtnPW0ud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxiZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPW0ucGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bS53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTttLkthKGQpfX0sZ2Y6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0ubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2YoKX0uYmluZCh0aGlzKSw1MDApfSxOZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMuc2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxRZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sc2I6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5GZChiKToiIn0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5RZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS4kZShiKXx8dGhpcy5NbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnpmJiZ3aW5kb3cuc2FuZGJveC56ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5YZyhiKSlyZXR1cm4gdGhpcy5YZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9CiExfWUudXJsJiZlLmhhc2gmJihlPWEuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUGsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZyxjLGUsaCx4KXt2YXIgaz1lfHxtO2U9ITA7eCYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGUsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxnLGMsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFFjOmZ1bmN0aW9uKGIsYSxkLGcsYyxlLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5RYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuWmMpZm9yKHZhciBjIGluIHRoaXMuWmMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5aY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5iYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlVtKGcuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlpjPWJ9LGtiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuaG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudnA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5HbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnhwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnRnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmxnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5xZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS51Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Eub2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5icD17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkhsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS52ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkdjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Euc2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5sZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Euc2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLklrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5EaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmxuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ybz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLnltfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e1JlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZz1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5EZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkRkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5SZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LEFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuUmUodGhpcy5jbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLApkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5EZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihmKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBmKWdbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBmW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGZbY10pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBmPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZjtyZXR1cm4gZ319KGMsZltjXSk6ZltjXTtmPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zi5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWY7Zi5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGZ9O2MuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1uPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5tbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Xaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLkxhPQp7fTt0aGlzLkc9bnVsbDt0aGlzLlZjPTEwMDt0aGlzLlJiPTA7dGhpcy5WYT0xNTA7dGhpcy5YYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlJiPD10aGlzLlZhPyh0aGlzLlJiKyssdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSk6MD50aGlzLlZhJiYodGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSl9LFhuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmI+dGhpcy5WYT8hMDohMX0seWY6ZnVuY3Rpb24oKXt0aGlzLlJiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxlbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5qYSgpXT1hO0wmJkwuRWgmJkwuQW8oYSl9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIGUuUGUodGhpcy5MYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZjtmb3IoZiBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZl0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX0sR206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx5cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLldqfHxxOyhmdW5jdGlvbihjKXtjLllqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVmM9MTA7dGhpcy5SYj0wO3RoaXMuVmE9NTA7dGhpcy5XPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuS2I9IiI7dGhpcy5QZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZj10aGlzLlRhKCksCmQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZilhLmNvbnRhaW5lcklkPWYuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5XPWF9LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV30saG86ZnVuY3Rpb24oYSl7dGhpcy5rZj1hfSxncTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtmfSxqZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUmI8PXRoaXMuVmEmJih0aGlzLlJiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5WYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxBcTpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5xbSgpfHx0aGlzLkxrKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApqcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sVTpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFhjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxkZjpmdW5jdGlvbigpe3JldHVybiExfSxmaTpmdW5jdGlvbihhKXt0aGlzLktiPWF9LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2J9LCRoOmZ1bmN0aW9uKCl7dGhpcy5LYj1udWxsfSxscTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuS2ImJihhPSEwKTtyZXR1cm4gYX0sdnE6ZnVuY3Rpb24oKXt0aGlzLlBnfHwodGhpcy5QZz0hMCl9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5Zanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmlnPSIxIjt0aGlzLmpnPSIyIjt0aGlzLkVrPSIzIjt0aGlzLmdkPTA7dGhpcy5ibj0zMDt0aGlzLmFjPVtdO3RoaXMubGI9W107dGhpcy52Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy52Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuZ2Q7dGhpcy5pZD1lLlkoMTApO3RoaXMuRWYoYSk7dGhpcy5mbyhiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxlLmdmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx6bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmtjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5rYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV09MX0sRG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZj1uZXcgSTt3aW5kb3dbZi5mYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUua2MoKSYmKHRoaXMuRmYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBmPSEwO2EmJihmPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnptKCk7CmlmKCF0aGlzLkRtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkZmKCk7cmV0dXJufXRoaXMuRmYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxmKTt0aGlzLnNpKCk7dGhpcy52Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5hYy5wdXNoKGEpLHRoaXMubGIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHNpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5hYyYmMDx0aGlzLmFjLmxlbmd0aCYmKHRoaXMuYWM9ZS51bmlxdWUodGhpcy5hYyksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYWMuam9pbigiLCIpKSk7aWYodGhpcy5sYil7Zm9yKHZhciBmPTA7Zjx0aGlzLmxiLmxlbmd0aDtmKyspdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl09PXRoaXMudmNbYV0mJmIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl08CnRoaXMudmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksYT10aGlzLmxiW2ZdLnJlYXNvbik7dGhpcy52Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihmPWUudW5pcXVlKGIpLGE9YSsiLSIrZi5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlnfSxGZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuamd9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Fa30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmdkfSxuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5pZ30sU3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmdkfSxFZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5UcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLnNufHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMudmI9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5XZygpO3RoaXMuS2UoKTt0aGlzLnhsPSExfSxXZzpmdW5jdGlvbigpe3RoaXMudmI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnZiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5LZSgpO2lmKHRoaXMudmIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxLZTpmdW5jdGlvbigpe2lmKCF0aGlzLnZiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMudmI9ITApO3RoaXMuVihiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5XJiYoMCx0aGlzLlcpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmtmJiYoMCx0aGlzLmtmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy56anx8c2E7KGZ1bmN0aW9uKGMpe2MueWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5nZDt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5yZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkViPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGY9MDtmPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2YrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ZdLnRhZyl7dGhpcy5FYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkViPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkViPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuRWI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGY9MDtmPApkLmxlbmd0aDtmKyspYS5vbihkW2ZdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZl0mJih0aGlzLnBlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZl0mJnRoaXMuTGgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuRWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuS2I7YiYmKGIuTGQoKSxiLndkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5oZC5pbmRleE9mKGIpJiZ0aGlzLmhkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5oZC5sZW5ndGg+PXRoaXMucmUmJnRoaXMuaSgpKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5KZT90aGlzLkplKys6dGhpcy5KZT0xOnRoaXMuSWU/CnRoaXMuSWUrKzp0aGlzLkllPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLk5mKGIudmlkZW9UYWcpP2IudmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5wZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSWU+dGhpcy5KZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLldnKCksYi5LZSgpLGIudmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy55anx8dGE7KGZ1bmN0aW9uKGMpe2MuQWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZiYmZigpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGY9MDtmPGIubGVuZ3RoO2YrKylhLnB1c2goYltmXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBmPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpmLnZifHx0aGlzLk0oZil8fHRoaXMuR20oZil8fCh0aGlzLk4oZiksZj1uZXcgdGEoZix0aGlzLkcpLGYuSigpLGYuZigpKX19dGhpcy5QKCl9fSxlcTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUucGIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkZqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWWQoYSl9LmJpbmQodGhpcykpfSxZZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5XJiZ0aGlzLlcoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGYpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGYpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuT2M9dGhpcy5CYT10aGlzLm9kPSExO3RoaXMuVmg9ZS5RYigxMCk7dGhpcy5VZj0hMDt0aGlzLkJjPXRoaXMudmg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksdGhpcy55YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlgsIjsiLHR5cGVvZiBhLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWD9hLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlg/dHlwZW9mIGEuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5JYT9hLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILklhP3R5cGVvZiBhLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5uZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm5lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC54ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlZoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApNYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkxjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saWg6ZnVuY3Rpb24oKXtpZighdGhpcy5PYyl7dmFyIGE9dGhpcy5MYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk9jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5PYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk9jfSxFbTpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLkNtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxDbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2QmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLm9kPSEwKTtyZXR1cm4gdGhpcy5vZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGY9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihmPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe3RoaXMuUG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sUG46ZnVuY3Rpb24oKXt0aGlzLkJjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixmPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihmPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7aWYoZS5EKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO2UuRCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxjcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5MaCgpfS5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuRW0oKSl7dmFyIGI9dGhpcy5MYygpLGY9dGhpcy5NYygpO2ImJmYmJih0aGlzLkJjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudmg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCksYT10aGlzLk1jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZj0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilmPSEwO2Z8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmCmIoZi5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5IY3x8KHRoaXMuSGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkhjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5IYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp3YjpmdW5jdGlvbigpe3JldHVybiBlLkdlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGUuRCgiZ2lnYS5kZSIpfHxlLkQoInNwaWVsZXRpcHBzLmRlIil8fGUuRCgia2luby5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSl0aGlzLlVmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5EKCJnaWdhLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLlFjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuVGwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkdlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlVmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlVmLGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMubXF8fCgxMDx0aGlzLmhwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmhwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuV24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sV246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaXApe3RoaXMuaXA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5ya3x8eWE7KGZ1bmN0aW9uKGMpe2MudGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmppKHdpbmRvdyk7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspdHJ5e2I9Ynx8dGhpcy5qaShhW2ZdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxqaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGUuUGUoYikpe2Zvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihhPW5ldyB4YShiW2ZdKSxhLmdhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy4kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5xZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlYoYSk6dGhpcy5VKCl9LHpuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2IsZj10aGlzLmphKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLm5jJiYoMDw9Zi5pbmRleE9mKGQpfHxiLkxkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5xZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMucWYrKztpZigxMDx0aGlzLnFmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sCllkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgUj1jLlRqfHxSOyhmdW5jdGlvbihjKXtjLlNqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGUpaWYodGhpcy5NYnx8KHRoaXMuTWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5NYisrLDE1PHRoaXMuTWIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5MZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMud2IoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBmPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWY9ITA7Znx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmYihmLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkpsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5KbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS56bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuU2p8fENhOyhmdW5jdGlvbihjKXtjLlVqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZj1uZXcgUihhW2JdKTtmLmdhfHx0aGlzLk0oZil8fCh0aGlzLk4oZiksCihuZXcgQ2EoZix0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVWp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnhtfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5maChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkJuPWEucG9zaXRpb25pbmc7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS53aWR0aD1hLndpZHRoO2Yuc3R5bGUubWluV2lkdGg9CmEud2lkdGg7Zi5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Yuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQm4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGYpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmLGIpfXRoaXMuVChmKTt0aGlzLlYoZik7dGhpcy5CZD1mfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkJkKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtlLkFoKHRoaXMuQmQpOwplLlllKHRoaXMuQmQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxkZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMud2p8fEdhOyhmdW5jdGlvbihjKXtjLnZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLnZqfHxJYTsoZnVuY3Rpb24oYyl7Yy54aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5maChhLCJlbGVtZW50SUQiKTtpZihlLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy54anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuRmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE1rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuJGc9dGhpcy5HaT0hMTt0aGlzLk1oPWQ7dGhpcy5raT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJm0mJm0uYWYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuJGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuamIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmtpP3RoaXMuamIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5qYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5qYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbSYmbS5hZih0aGlzLkZhLnVybCkmJiFiP2UudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTptLmFmKHRoaXMuRmEudXJsKSx0aGlzLk1oJiZ0aGlzLk1oKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5rZT0hMX1jLmJqPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMua2U9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxVbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXtDcDoiQWRDbGlja1RocnUiLEVwOiJBZEVycm9yIixGcDoiQWRTdG9wcGVkIiwKSXA6IkFkTGluZWFyQ2hhbmdlIixKcDoiQWRUYWdQYXJzZWQiLE1wOiJBZFZpZGVvQ29tcGxldGUiLFBwOiJBZExvYWRlZCIsUXA6IkFkU2tpcHBlZCIsUnA6IkFkU3RhcnRlZCIsR3A6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixIcDoiQWRJbXByZXNzaW9uIixEcDoiQWRDcmVhdGl2ZVZpZXciLEtwOiJBZFZpZGVvTWlkcG9pbnQiLExwOiJBZFBhdXNlZCIsTnA6IkFkVmlkZW9TdGFydCIsT3A6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5rZSxhW2RdKX0sVG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmplKWZvcih2YXIgYSBpbiB0aGlzLkdhLmplKXRoaXMuR2EuamUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5qZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMua2UmJnRoaXMuVW4oKTt0aGlzLkdhJiZ0aGlzLlRuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5vYj0iIjt0aGlzLnBkPXRoaXMuZGM9dGhpcy5uYj1udWxsO3RoaXMuU2c9dGhpcy56Yj10aGlzLmNmPSExO3RoaXMuQWE9IiI7dGhpcy5iZj0hMTt0aGlzLnFhPXRoaXMuTmM9IiI7dGhpcy5YZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy53Zj0hMTt0aGlzLmhhPVtdO3RoaXMuVGU9dGhpcy5UYj0iIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuZ2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5CYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy4kYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5VYj0iIjt0aGlzLlZiPVtdO3RoaXMuV2I9W107dGhpcy5hZD1bXTt0aGlzLnNjPSIiO3RoaXMuRmI9ITE7dGhpcy5YZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm1jPSExO3RoaXMuSGc9dGhpcy5iZT1udWxsO3RoaXMuSmY9dGhpcy5oYj10aGlzLlJnPXRoaXMuJGQ9dGhpcy5WZj10aGlzLnJkPXRoaXMud2M9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5HZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5EYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmpkPXRoaXMua2Q9IiI7dGhpcy5rYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5XYz1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsCmFkdGFncGFyYW1ldGVyOnRoaXMub2IsYWR0YWdtb2RpZmllcjp0aGlzLm5iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5kYyxhZHRhZ3JlZ2V4OnRoaXMucGQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuY2Ysc2lkZWxvYWRzOnRoaXMuemIsZGlzYWJsZXRlc3RzOnRoaXMuU2csaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5iZixnbG9iYWxDb25maWc6dGhpcy5OYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuWGUsc2VydmVyOnRoaXMuaGEsc3ZtQ29uZmlnOnRoaXMuVGIsaG9tYWRBZHBhdGg6dGhpcy5UZSxIT01BRF9WRVJJRklFRDp0aGlzLmhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5nZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5CYixIT01BRF9BREJMT0NLRVI6dGhpcy4kYix0ZXN0SGlkZTp0aGlzLlViLHRlc3RUYWdzOnRoaXMuVmIsdGVzdFRhZ3NKUzp0aGlzLldiLAp0ZXN0VGFnc1hIUjp0aGlzLmFkLHRlc3QzUENvb2tpZTp0aGlzLnNjLHRocm90dGxlOnRoaXMuWGQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5tYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMud2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnJkLHVzZVN0cmljdENoZWNrczp0aGlzLlZmLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLiRkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMuQWYsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmFiLHZwYWlkOnRoaXMuaGIsc2tpcEFsbG93ZWQ6dGhpcy5KZix2bWFwczp0aGlzLiRmLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5EYyxhZEZhbGxiYWNrVVJMOnRoaXMua2QsYWRGYWxsYmFja0NvbmZpZzp0aGlzLmpkLHlpZWxkbGFiOnRoaXMua2J9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMub2I9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5uYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLmRjPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMucGQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5jZj1iLmpzcG9wdXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpZGVsb2FkcyYmKHRoaXMuemI9Yi5zaWRlbG9hZHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZGlzYWJsZXRlc3RzJiYodGhpcy5TZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYKKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmJmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLk5jPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNCbG9ja2VkJiYodGhpcy5YZT1iLmlzQmxvY2tlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXImJih0aGlzLmhhPWIuc2VydmVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuVGI9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5UZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5oZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmdlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLkJiPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuJGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJih0aGlzLlViPWIudGVzdEhpZGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3MmJih0aGlzLlZiPWIudGVzdFRhZ3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NKUyYmKHRoaXMuV2I9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYKKHRoaXMuYWQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnNjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5YZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5tYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5IZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkQmxvY2tlckRldGVjdGVkJiYodGhpcy53Yz1iLmFkQmxvY2tlckRldGVjdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnJkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5WZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLiRkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy4kYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMuQWY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYodGhpcy5hYj1iLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudnBhaWQmJih0aGlzLmhiPWIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLkpmPWIuc2tpcEFsbG93ZWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy4kZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkRjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tVUkwpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja0NvbmZpZyYmKHRoaXMuamQ9Yi5hZEZhbGxiYWNrQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnlpZWxkbGFiJiYodGhpcy5rYj1iLnlpZWxkbGFiKX0sb206ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmKGI9ITApO3JldHVybiBifSxDZjpmdW5jdGlvbihiKXt0aGlzLiRhW2JdPSEwfSxZbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxXZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5RYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLiRrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGc9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuJGUoYik7CmM9dGhpcy5hYShiKTtnPyh0aGlzLlBjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMub2J8fHRoaXMubmJ8fHRoaXMuZGN8fHRoaXMucGQpJiYoaD10aGlzLmRuKGgpKTtiPW5ldyBDKGUpO2IudXJsPWU7ZT0iIjtlPWc/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuJGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSwkZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlBjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxQYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5oYSYmdGhpcy5oYS5sZW5ndGgmJjA8dGhpcy5oYS5sZW5ndGgmJihhPXRoaXMuaGFbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sYWY6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy4kZShiKTtyZXR1cm4gYX0sCiRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLllwO3JldHVybiJub25lIn0sSGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYVt0aGlzLkFmXX0scGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhkKCksYT10aGlzLkhmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEloOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZyl7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxjbjpmdW5jdGlvbihiLGEpe3ZhciBkPWUuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPGgubGVuZ3RoO0IrKyl7dmFyIGs9aFtCXS5zcGxpdCgiPSIpO2dba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZ1tsXT10aGlzLkloKGdbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5JaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGRuOmZ1bmN0aW9uKGIpe3RoaXMub2ImJgooYis9dGhpcy5vYik7aWYodGhpcy5uYilmb3IodmFyIGEgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm5iW2FdKSk7dGhpcy5kYyYmKGI9dGhpcy5jbihiLHRoaXMuZGMpKTtyZXR1cm4gYn0scGw6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuamwodGhpcy55YS5jbGllbnRBUElzKX0samw6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE5hO2IucHVibGlzaGVyQVBJJiZhLmtvKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5qbyhiLnBsYXllcik7YS5mKCl9fSxnOmZ1bmN0aW9uKGIsYSxkLGcsYyxlKXttPXRoaXM7dGhpcy5iZj0hMDt0aGlzLk5jPWI7dGhpcy5xYT1hO3RoaXMud2Y9ZDt0aGlzLmJlPWc7dGhpcy5oYz1jO3RoaXMueWE9ZXx8e307dGhpcy5wbCgpO3RoaXMuVG0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5SbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuRmMoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5GYygpfWNhdGNoKGspe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9fSx4YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sVG06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuTmMrdGhpcy52ZSgiZ2xvYmFsIikpLHRoaXMubW0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5GYygpfS5iaW5kKHRoaXMpLCEwKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy52ZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5GYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5DZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sdmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlFiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMucmQpe3RoaXMucmQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGYpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaGM9CiExKTsiZm9jdXMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5oYz0hMSk7dGhpcy5oYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhjP3RoaXMuaGMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlhlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLmdlKSk7dGhpcy5ZYigpO2UuSmMoay54bik7KGE9ZS5VYSh0aGlzLkhkKCkpKXx8KGE9ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbW06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJgooZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5UYnx8dGhpcy5BYXx8dGhpcy5GYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpLHRoaXMuWWIoKSl9fSxGYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExOwp0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGY7KGY9dm9pZCAwPT09YSl8fChmPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5IZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihmKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5EKCJ3ZWIuZGUiKXx8ZS5EKCJnbXgubmV0Iil8fGUuRCgiZ214LmF0Iil8fGUuRCgiZ214LmNoIil8fGUuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlBjKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5laShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuamQ9ZC5hZF9mYWxsYmFja19jb25maWd8fAohMTt0aGlzLlRiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5UZT1kLmFkcGF0aHx8IiI7dGhpcy5BZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlRiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLlJjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKSx0aGlzLlliKCkpfSxlaTpmdW5jdGlvbihiKXt0aGlzLmtkfHwodGhpcy5rZD1ifHwiIil9LFJjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucGMoKSksZD10aGlzLmFhKHRoaXMuVGIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsCiIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuVGIrdGhpcy52ZSgiY3VzdG9tZXIiKSk7dGhpcy5LYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm1jPSEwO3RoaXMuUmMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fApkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuVmY9dGhpcy5nYihkLnN0cmljdCk7dGhpcy4kZD10aGlzLmdiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlJnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5hYj10aGlzLmdiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5nYihkLmVuYWJsZWQpO3RoaXMuVWI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5XYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmFkPWQudGVzdGFkdGFnc3hocnx8CltdO3RoaXMuc2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMub2I9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5kYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucGQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuY2Y9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuaGI7dGhpcy5KZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnNkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy4kZj1kLnZtYXBzfHwiIjt0aGlzLkRjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmVpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5qZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5YZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMua2I9CmQueWllbGRsYWJ8fG51bGw7IXRoaXMubWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1jPSEwLHRoaXMuUmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT28oKSYmKHRoaXMuVWJ8fHRoaXMuV2J8fHRoaXMuVmJ8fHRoaXMuYWQpP3RoaXMud2Y/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLkJiKSksdGhpcy5CZSgpLHRoaXMuWWIoKSk6dGhpcy5HbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlJmKCkpfX0sWG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSksYj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6Yixob21hZF91cmxfc3VmZml4X2Jhc2U2NDplLnBiKGIpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07ZS5RYyh0aGlzLnBjKCksIlBPU1QiLGIsZnVuY3Rpb24oYil7dHJ5e3ZhciBhPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXt9ZS50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghYXx8IWEubGVuZ3RoKSwhMCk7dHJ5e2EmJmEubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlciYmKHRoaXMub2IrPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihhWzBdLmlkKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgYT0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuWSgxMCksaD1lLlkoMTApLEI9ZS5ZKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwpiKEIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKStiKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnBiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUuQWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApOwpyZXR1cm59dGhpcy5zYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sUmY6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKTt0aGlzLlliKCl9LCRjOmZ1bmN0aW9uKGIsYSl7dGhpcy53Yz0hMDt0aGlzLmtiJiYhdGhpcy5IaT8odGhpcy5YbSgpLHRoaXMuSGk9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoYixhKX0uYmluZCh0aGlzKSw1MDApKTp0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIoYikpLHRoaXMuWWIoKSx0aGlzLkJlKCkpfSxGbzpmdW5jdGlvbigpe2lmKHRoaXMuVWIpe3ZhciBiPWUuQWQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkptKCkpdGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7CnRyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVWIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5VYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChnKXt9Yj90aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm5pKCl9fWVsc2UgdGhpcy5uaSgpfSxQZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuUWIoKSksdGhpcy5LbyhnLAowPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLk9mLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLk9mKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5WYj10aGlzLmFkKSYmdGhpcy5WYi5sZW5ndGgpe3ZhciBkPXRoaXMuVmIuc2xpY2UoKSxnPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5PZigpfSxLbzpmdW5jdGlvbihhLGYsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5RYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5QZi5iaW5kKHRoaXMpLGYuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5QZigpfX1mdW5jdGlvbiBmKCl7dGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLldiJiZ0aGlzLldiLmxlbmd0aCl7dmFyIGQ9dGhpcy5XYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlBmKCl9LExvOmZ1bmN0aW9uKGEsZixkKXtmdW5jdGlvbiBnKCl7ZSgpJiZmKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZil7Zj09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sT2Y6ZnVuY3Rpb24oKXtpZih0aGlzLnNjKXRyeXtlLlFjKHRoaXMuc2MsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRmI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5SZigpfS5iaW5kKHRoaXMpLHRoaXMubGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5saSgpfWVsc2UgdGhpcy5SZigpfSxsaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpO3RoaXMuWWIoKTt0aGlzLkJlKCl9LEptOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApZYjpmdW5jdGlvbigpe3ZhciBhPSIwIixmPSIwIjt0cnl7ZS5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLndjJiYoZj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitmLCEwKTsodGhpcy5DYSYmdGhpcy5pc0VuYWJsZWQmJmUuRCgiY2hpcC5kZSIpfHxlLkQoImZvY3VzLmRlIikpJiZ0aGlzLmNsKCk7dGhpcy5zYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkZiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5oZSkpO3RoaXMuYmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5iZSYmdGhpcy5iZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5GYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuV2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5XYy5pZD1lLlkoMTApO3RoaXMuV2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLldjKTt2YXIgYT0KdGhpcy5XYy5jb250ZW50V2luZG93LGY9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Quc3JjPSJodHRwczovL3Vwcy54cGxvc2lvbi5kZS9sb2FkZXIvOTE2MjgvZGVmYXVsdC5qcz94cGxyZGlyPTEiO2EuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKTtmLnNyYz1lLnllKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZS50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sCm9sOmZ1bmN0aW9uKCl7aWYodGhpcy4kZCYmdGhpcy5vbSgpKXt2YXIgYT10aGlzLllsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxzaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZixkLGcsYyxoKXt0aGlzLkdkfHwodGhpcy5HZD0wKTt0aGlzLkdkKys7dGhpcy5HZD50aGlzLnBoJiYhdGhpcy5xaCYmKHRoaXMucWg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLnBoLCEwKSk7YT1uZXcgTWEoYSxmLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpOwpnJiYoYS5HaT0hMCk7YyYmZS5IbSgpJiYoYS4kZz0hMCk7aCYmKGEua2k9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLmFufHwodGhpcy5hbj0hMCxlLkRhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhmPWEucmVzcG9uc2VYTUwpfHwoZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJgpnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlBjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1lLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGYpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLiRmfSxtbDpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hcC5iaW5kKHRoaXMpLHRoaXMuJG8uYmluZCh0aGlzKSl9LGFwOmZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsO3RyeXsoZj1hLnJlc3BvbnNlWE1MKXx8KGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5JbCgpfSwkbzpmdW5jdGlvbigpe30sSWw6ZnVuY3Rpb24oKXtlLkpjKGsuSGwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEJlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09Zi50eXBlJiZlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWYudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LE9vOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGR9LFFiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGY9IiIsZD0wO2Q8YTtkKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGZ9LGdiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PQphfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGY9IiIsZCxnLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZj1mKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspOwpyZXR1cm4gZn0sYWE6ZnVuY3Rpb24oYSl7dmFyIGY9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtmW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixmKXtiJiYoZC5xdWVyeUtleVtiXT1mKX0pO3JldHVybiBkfSxIZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBmKGEpe3ZhciBiPQoiIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsYis9Zi50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWVbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyllW2ddPWQoZVtnLTNdXmVbZy04XV5lW2ctMTRdXmVbZy0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnF8biZyfHEmcikrdStlW2ddKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihmKGgpK2YoaykrZihsKStmKG0pK2YodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnVqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLkJrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZixkKXt0aGlzLmE9CmE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5iaS5iaW5kKHRoaXMpLG11dGU6dGhpcy5sZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEucmI7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5pYz10aGlzLnFkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zjt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5VZD17fTtlLnViKCJuZXdCaWdBZElkIik7dGhpcy5hbD1lLlkoMTApO3RoaXMuTGY9MDt0aGlzLm5kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMubmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMubmQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYKInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVWM9dGhpcy5UZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy51ZT0hMTt0aGlzLnZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubmM9ITE7dGhpcy56bD1lLlkoMTApO3RoaXMuUGI9ZS5ZKDEwKTt0aGlzLk5iPWUuWSgxMCk7dGhpcy5naT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmNlPXRoaXMuWmI9dGhpcy5GZT10aGlzLnhkPXRoaXMuVmQ9dGhpcy5BYj10aGlzLnVjPXRoaXMuUGg9dGhpcy5FZT10aGlzLkNkPXRoaXMuUG89dGhpcy5EYj10aGlzLk9iPSExO3RoaXMuemM9W107dGhpcy5vYz17fTt0aGlzLnRuPTIwMDt0aGlzLmNnPXRoaXMuY2Q9dGhpcy5FYz10aGlzLmJnPXRoaXMudmY9ITE7CnRoaXMubmY9e319Yy5vaj1hO2EucHJvdG90eXBlPXskbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGY9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBmfSx0aTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5MYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMud28oKTtlLm8oay5Kayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmZjpmdW5jdGlvbihhLGYsZCxjKXt0aGlzLkRiPWQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQS5TKXRoaXMuTGYrKyxlLnViKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxjPW0uZ2V0Q29uZmlnKCksZS5HZSYmKHRoaXMuQS5hbyh7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksCmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy50aSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpmLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpmPyh0aGlzLnRpKCksbmV3IFModGhpcyxhLHRoaXMuR2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaGIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB3Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3Yy5mZihhLGYsZCl9LDUwKX19LHJmOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5jZT10aGlzLlpiPXRoaXMuRWU9dGhpcy5DZD0hMTt0aGlzLmI9YTt0aGlzLnFvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLnpjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5VZD10aGlzLmltKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBmPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGY9dGhpcy5iaChiLnBhcmVudCkpLGYucHVzaCh0aGlzLlNsKGIpKSk7CnJldHVybiBmfSxTbDpmdW5jdGlvbihhKXt2YXIgZj0iIixkPVtdO2lmKGEmJmEuTCYmYS5MLmdldEF0dHJpYnV0ZSl7Zj1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmYsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGY9W10sZD1bXSxjPVtdLGU9W10saD0iIjtpZihhLkwpe2Y9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPQowO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKWQucHVzaChhLnNiKGZba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGY9YS5lcnJvci5kZXRhaWwuY29kZSksYS56ZCYmYS56ZC5lcnJvciYmYS56ZC5lcnJvci5jb2RlJiYoZj1hLnpkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZWQuY29kZTpmPT1GLmxlLmNvZGU/ZS5vKGsudnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnUoKSk6KGUuZ2YoKSxmPT1GLmdnLmNvZGUmJmUubyhrLmduLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpO2UubyhrLkdsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54bygpO3RoaXMuV2EoImVtcHR5Iik7dGhpcy5BLkZiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRmIsITApO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLmJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaGcuY29kZTplLm8oay53cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5tZS5jb2RlOmUubyhrLnhwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTsKYnJlYWs7Y2FzZSB2LmllLmNvZGU6ZS5vKGsuaG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB2LmZlLmNvZGU6ZS5vKGsuWW8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB2LmRnLmNvZGU6ZS5vKGsuWm8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMuamMoYSk7dGhpcy5RYSgpfSxqYzpmdW5jdGlvbihhKXt2YXIgZj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZj1hLmVycm9yLmNvZGUsOTAxPGYmJihmPTkwMCkpO2ZvcihmPXsiW0VSUk9SQ09ERV0iOmZ9O2EuT2EubGVuZ3RoOyl0cnl7dmFyIGQ9YS5PYS5wb3AoKTt0aGlzLmVmKGQudXJsLGQudHlwZSxmKX1jYXRjaChjKXt9fSwKcW86ZnVuY3Rpb24oYSl7dGhpcy5GZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuR2YodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihmPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9ZjtmPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2QmJmQuZW52dmFycyYmKGM9ZC5lbnZ2YXJzKCkpO2MudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRWQmJihjPWQuRWQoKSk7Yy52aWRlb1Nsb3QmJihmPWMudmlkZW9TbG90LHRoaXMudmY9ITApfWNhdGNoKGgpe31mLnhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihmLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pOwppZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmYuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuU2smJnRoaXMucGxheWVyLk1lKCkmJihmLnZvbHVtZT10aGlzLnBsYXllci5NZSgpLzEwMCk7Zm9yKDtmLmZpcnN0Q2hpbGQ7KWYucmVtb3ZlQ2hpbGQoZi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZi5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZixhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnZmJiZmLmxvYWQoKTtpZih0aGlzLm9pKGYpKXt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGYpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMudmY/dGhpcy52aWRlbz1mOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChmKX1jYXRjaChsKXt0aGlzLnZpZGVvPWZ9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZiksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxvbzpmdW5jdGlvbigpe3RoaXMuYmc9ITA7CnRoaXMuQWI9dGhpcy51Yz0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5BYj0hMCk7ZS5DZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5vYSYmZS5Sayh0aGlzLmIub3JpZ2luLm9hKTt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlFoKCk7dGhpcy5hLklmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5JZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5HZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy56aSgidnBhaWQiKTsKaWYodGhpcy5BYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlNiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfXRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7CnRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5HZih0aGlzLkYsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkYub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMua2EmJnRoaXMuYS5jLmthKCkmJihhPSEwKTt2YXIgYj10aGlzLmIubG0oKSxjPXRoaXMuYi5zLk9yaWdpbmFsQWRQYXJhbWV0ZXJzO2lmKGImJmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgaD10aGlzLkEuZ2V0Q29uZmlnKCk7aCYmaC5hZEZhbGxiYWNrQ29uZmlnJiZoLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihjPUpTT04uc3RyaW5naWZ5KGguYWRGYWxsYmFja0NvbmZpZykpfXZhciBrPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLAphZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5sYSh0aGlzLkYsImNvbmZpZyIsayk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsCiJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnllKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7ZS53ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5HYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuemM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5qcChhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLmtwKCksdGhpcy5hLmxjKCEwKSwhdGhpcy5aYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5aYj17ZWw6dGhpcy5GLApjYjpmdW5jdGlvbigpe3RoaXMuY2U9ITA7ZS5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuWmUodGhpcy5aYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmxjKCEwKSx0aGlzLm9wKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5sYyghMCksdGhpcy5zcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ycCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnRwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnBwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkVpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5xYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkEuRGN8fHRoaXMuY2QpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5jZCYmKHRoaXMuY2c9ITEsdGhpcy5yYygpKSx0aGlzLm1wKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuQWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlNiKCJtdXRlZCIsInVzZXIiKSxlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5BYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuU2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuVGYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsuc2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7ZS53ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLndlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnhnKGZ1bmN0aW9uKGEpe2UubGEodGhpcy5GLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sbHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnVjPSEwfSxtcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmxkLHRoaXMuYi5zLAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudWM9ITF9LG9wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsudGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuc2csdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5paSgpO2UubyhrLm9nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2UubyhrLmxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuQ2Q9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmxnLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxycDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSx0cDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0scHA6ZnVuY3Rpb24oKXt0aGlzLlhmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sRWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGY9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZik7CmUuQ2UoKTt0aGlzLkY9ITE7dGhpcy5RYShhKX19LGpwOmZ1bmN0aW9uKGEpe3ZhciBmPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWYmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGY9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGYubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTtlLm8oay51cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuRWkoITApfSxOazpmdW5jdGlvbihhLGYpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUGMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChmLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuZ3AuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoZix0aGlzLkEpKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFFrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuWmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sUGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuQmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5aZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5pY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljfHx0aGlzLlpmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWWspKX0sWmY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWQmJnRoaXMub2kodGhpcy52aWRlbykmJiF0aGlzLk9iJiYhdGhpcy5pYyl7dGhpcy5xZD0hMDt0cnl7aWYoIWUuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuT2J8fCh0aGlzLk9iPSEwLHRoaXMuUGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5ZYSgpLCEwKSx0aGlzLkEuUmd8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChmKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLmVwKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuSWYoKTt0aGlzLmNwKCk7dGhpcy56aSgpO3RoaXMuQWcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuTWYoKX19LE1mOmZ1bmN0aW9uKCl7dGhpcy54ZHx8dGhpcy5tZygpfSxtZzpmdW5jdGlvbihhKXt2YXIgZj10aGlzLnZpZGVvLnBsYXkoKTtpZihmJiZmWyJjYXRjaCJdKWZbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnhkfHwoYT90aGlzLlFhKCk6KHRoaXMubGYoITApLHRoaXMubWcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMudWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk1mKCkpfS5iaW5kKHRoaXMpO3RoaXMuT2UoKS5maSh0aGlzKX0sWGY6ZnVuY3Rpb24oKXt0aGlzLkEuYWImJiF0aGlzLk9iJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWGEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5FZT0hMDtlLm8oay5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUWEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBmPVtdLGQ9ITEsYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZS5naChhW2NdKSxmLnB1c2goZCk7YT17aGFzaGVzOmZ9O2E9ay5TYShhLHRoaXMudSgpKTtlLnVvKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5lZSYmdGhpcy5Layh0aGlzLmIuZWUpOwppZighdGhpcy5GZSlpZih0aGlzLkZlPSEwLHRoaXMuY2V8fChlLm8oay5sbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5DYnx8dGhpcy5iLnhjKXtlLnViKCJuZXdTbWFsbEFkSWQiKTt0aGlzLkxmKys7dGhpcy5pYz10aGlzLnFkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGYpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnhpKCl9Y2F0Y2goaCl7fXRoaXMuVmQ9ITA7dGhpcy5hLlNlKCk7dGhpcy5uYz0hMTt0aGlzLk9lKCkuJGgoKTt0aGlzLmIuQ2ImJnRoaXMuYi5vcmlnaW4ubWYoKTt0aGlzLmIueGMmJihhP3RoaXMuYi5vcmlnaW4uSmgoKTp0aGlzLndkKCkpfWVsc2UgdGhpcy53ZCgpfSwKZ3A6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLllmKGEpKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5pYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTt0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxDaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5RYSgpO2Vsc2V7dGhpcy5uYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkdjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5UbyhhKTtpZighdGhpcy5aYil7dmFyIGY9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGY9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlpiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5jZT0hMDtlLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmYscGVyY2VudDpkLHN0YXJ0VGltZTohMX07ZS5aZSh0aGlzLlpiKX1kPSIiO3RoaXMuYi5LZiYmKGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5naSkpJiYoZD10aGlzLmIuS2YtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIiwKZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlRkfHwodGhpcy5UZD0hMCxmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5zZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5DYj8odGhpcy5pYz10aGlzLnFkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmliLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEueGkoKSx0aGlzLmIub3JpZ2luLm1mKCkpOnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxmLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMubmQucmVwbGFjZSgiW3RpbWVdIixlLmFoKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudWU9ITA7CnRoaXMudmlkZW8uY29udHJvbHM9ITF9fSx1aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuQ2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxUbzpmdW5jdGlvbihhKXtlLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudml8fHRoaXMuT2J8fCgwPT1hJiYodGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMuQS5GYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuRmIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy51aSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMudWkoKX0uYmluZCh0aGlzKSksdGhpcy5PYnx8CnRoaXMuaWkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5hYiYmdGhpcy5YYSgic3RhcnQiKSxlLm8oay5vZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGUubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMuQ2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLm8oay5sZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLAplLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy52aT1hKX0saGk6ZnVuY3Rpb24oYSxmKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsZiwhMCl9LHdvOmZ1bmN0aW9uKCl7ZS5iZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxpaTpmdW5jdGlvbigpe2UuYmQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtlLmJkKFsic3RhdHNfaGRfYWRfZW1wdHk6IisKdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2UuYmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuYmd8fHRoaXMuQS5hYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxTYjpmdW5jdGlvbihhLGYpe3RoaXMuQS5hYiYmZS50cmFjaygic3RhdHNfaGRfIithLGYsITApfSx0cmFjazpmdW5jdGlvbihhLGYpe2lmKCF0aGlzLk9iKXt0aGlzLm5mJiZ0aGlzLm5mLnRyYWNrJiZ0aGlzLm5mLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZS5HZSYmZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09CiEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5FYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlVkLmltcHJlc3Npb25zJiZlLkZtKGgudXJsLHRoaXMuVWQuaW1wcmVzc2lvbnMpP3RoaXMuZWYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UubyhrLklrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5lZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZil0cnl7dGhpcy5iLk9hPXRoaXMuQ2wodGhpcy5iLk9hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsCmY9IiI7dGhpcy5iZyYmKGY9Il92cGFpZCIpO3RoaXMuY2QmJihmPSJfd2VsZWN0Iik7cmV0dXJuIGErZn0sZWY6ZnVuY3Rpb24oYSxmLGQsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZj10aGlzLkEud2EoYSksZCYmZi5NayhkKSxjfHwoYz10aGlzLlFnKSxlfHwoZT10aGlzLlFnKSx0aGlzLk9rKGEpLHRoaXMuQS5LYShmLGZ1bmN0aW9uKCl7dGhpcy5aaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlpoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxPazpmdW5jdGlvbihhKXt0aGlzLm9jW2FdPSJvcGVuIn0sWmg6ZnVuY3Rpb24oYSl7dGhpcy5vY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLm9jPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZjtmb3IoZiBpbiB0aGlzLm9jKXRoaXMub2MuaGFzT3duUHJvcGVydHkoZikmJiJvcGVuIj09dGhpcy5vY1tmXSYmYSsrO3JldHVybiBhfSxqbTpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0KZn0pfSxDbDpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Zn0pfSxlcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2Eud2cmJmEud2codGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGUuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMucmMoKTtlbHNlIGlmKHRoaXMuYi5xYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5EZXx8KHRoaXMuYi5EZT0xKTtpZigxMDA+YS10aGlzLmIuRGUpcmV0dXJuO3RoaXMuYi5EZT1hfWNhdGNoKGYpe31lLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQoiX3RvcCI7aWYodGhpcy5BLkRjfHx0aGlzLmNkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnFifWNhdGNoKGYpe2E9d2luZG93Lm9wZW4odGhpcy5iLnFiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX19fS5iaW5kKHRoaXMpLDUwMCl9fSxjcDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5uZC5yZXBsYWNlKCJbdGltZV0iLGUuYWgoMCkpO3ZhciBmPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5zZCYmKGY9dGhpcy5BLnNkKTtmJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhiLmJpbmQodGhpcyksMUUzKmYpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5zZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sClJkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEuc2QpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZS5OZih0aGlzLmNvbnRyb2xzKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuUGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucmkuYmluZCh0aGlzKSksZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5yaS5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnBpLmJpbmQodGhpcykpLGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLk5iO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmdpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLktmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLndpZHRoPSIxMDAlIixmLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixmLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixmLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixmLnN0eWxlLmJvdHRvbT0iMHB4IixmLnN0eWxlLnpJbmRleD0iMTAwMDAiLGYuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGYpO3RoaXMuYS54ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5sZigpKTt0aGlzLkliKCl9fSxJYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHJjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmNnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpKX0scmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnVjPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudWM9ITEpOihlLmxhKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy51Yz0hMCl9LExkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuU2IoIm11dGVkIiwidXNlciIpLGUubyhrLkpkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpOwp0aGlzLkFiPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5TYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxxYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYyk7dGhpcy54ZHx8dGhpcy51ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTWYoKSl9LHdkOmZ1bmN0aW9uKCl7dGhpcy5PbSgpJiZ0aGlzLk5tKCkmJih0aGlzLkEud2N8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuTGImJnRoaXMuVW8oKXx8KHRoaXMueGQ9ITAsdGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy5MZygpKX0sT206ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCk7aWYoIXRoaXMuQS5oYnx8ZS5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGY9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuRGEoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZitkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuVWN8fChhPQohMCxmLmFkRmFsbGJhY2tVUkx8fChmLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkVjJiZmLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5VY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRWM/ImFueSI6IiIpKyhmLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5VYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRWMmJmYuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlVjfSxabDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxmPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1mLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmYuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1lLnllKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5mZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy53ZCgpfXZhciBmPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWmwoKTt0aGlzLkVjPXRoaXMuVWM9dGhpcy5jZD10aGlzLmNnPSEwO3JldHVybiBmPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2YsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy50bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlNlKCksdGhpcy5hLlluKCksdGhpcy5uYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkVlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5PZSgpLiRoKCkpfSxPZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxBZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLlllKHRoaXMudmlkZW8sYSk/dGhpcy5iaSgpOnRoaXMuTGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5xYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5DYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy56YyYmMDx0aGlzLnpjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy56YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5hbCsiLSIrdGhpcy5MZjt0aGlzLmImJnRoaXMuYi5oaCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuaGgoKSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5sa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtmPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlg9W107dGhpcy5MPW51bGw7dGhpcy55Yz10aGlzLkFjPSExO3RoaXMub2E9IiI7dGhpcy5hZz0hMTt0aGlzLnNoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGYsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZj1mdW5jdGlvbigpe3JldHVybiBjKCkmJihlLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRCgiZmFuZG9tLmNvbSIpfHxlLkQoImdpZ2EuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGMoKXx8ZigpKXt2YXIgaD1lLk5nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGY9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuRCgiZ2lnYS5kZSIpfHxlLkQoImtpbm8uZGUiKXx8ZS5EKCJzcGllbGV0aXBwcy5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZigpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1kKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLldkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5LYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxkaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkxiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChmKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5MYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuTGJ8fHRoaXMuTG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0uRW8oKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sTG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2M9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksYz1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkduKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLnNoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWC5sZW5ndGgpdGhpcy5UYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuZWQse2Vycm9yOnRoaXMuYWc/Ri5sZTpGLmZnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGQpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLlgubGVuZ3RoP3RoaXMuVGMoKTp0aGlzLnJhKHRoaXMuUmEodi5lZCx7ZXJyb3I6dGhpcy5hZz9GLmxlOkYuZmd9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuZWcse2RlcHRoOmJ9KSl9LFRjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWC5zaGlmdCgpO3RoaXMuUG0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubWgoKSxmLHtBZFN5c3RlbTp0aGlzLlJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmhnKSk6KGI9MCx0aGlzLldvKCkmJnRoaXMucmYodGhpcy5CbCgpKSl9LG1mOmZ1bmN0aW9uKCl7dGhpcy5BYz8odGhpcy5BYz0xPHRoaXMuWC5sZW5ndGgsCnRoaXMuWC5sZW5ndGgmJnRoaXMuVGMoKSk6dGhpcy5wYXJlbnQubWYoKX0sSmg6ZnVuY3Rpb24oKXt0aGlzLnljPyh0aGlzLnljPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLlRjKCkpOnRoaXMucGFyZW50LkpoKCl9LFdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLktjKCk/dGhpcy5yYSh0aGlzLlJhKHYuZmUpKTp0aGlzLnJhKHRoaXMuUmEodi5kZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuZWQsRi5nZykpLCExKX0scmY6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuZWV8fChhLmVlPVtdKTthLmVlLnB1c2godGhpcy5zaCk7YS5PYT1hLk9hLmNvbmNhdCh0aGlzLmhmKCkpO2EuQ2I9YS5DYj9hLkNiOnRoaXMuQWM7YS54Yz1hLnhjP2EueGM6dGhpcy55YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWmc7dGhpcy5wYXJlbnQucmYoYSl9LApCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLktjKCk7YS5PPXRoaXMuamgoKTthLnFiPXRoaXMuVWwoKTthLkVxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUWwoKTthLktmPXRoaXMuaG0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpkLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGMpe319dGhpcy5MJiYoYS5PYT1hLmVycm9yLmNvZGUhPXYuZmUuY29kZT9hLk9hLmNvbmNhdCh0aGlzLlZsKCkpOmEuT2EuY29uY2F0KHRoaXMuZG0oKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5qYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmpjJiZ0aGlzLnBhcmVudC5qYyhhKSxiPTAsdGhpcy5UYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGpjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmpjKGEpfSxUZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxNbzpmdW5jdGlvbigpe3JldHVybiBiPApmfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuamgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5LYygpfSxRZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LG1pOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5RZigpJiYoYT0hMCk7cmV0dXJuIGF9LEduOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5hZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxQbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLm1oKCkubGVuZ3RofSxtaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5lKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFJsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmUodGhpcy5MLCJBZFN5c3RlbSIpfSxoZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1jJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fAphLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnpoKGEpKXt2YXIgZj1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Yy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpmLHVybDp0aGlzLnNiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxWbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmpoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFpwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnNiKGFbZF0pfSk7dmFyIGM9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGI9Zi5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxRbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixkPSExLGM9W10sYj0hMSxmPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Y9Yj10aGlzLkZkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWMucHVzaChkKTtlLnB1c2goZil9MTxhLmxlbmd0aD8oYj1jLGg9Zik6KGI9ZCxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxLYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnNiKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGhtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsYz0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGM9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUudG8oYyxhKSwwPmImJihiPSExKX1jYXRjaChmKXtiPSExfXJldHVybiBifSxOZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuc2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxzYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkZkKGEpOiIifSxGZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5RZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5QaXx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk89W107dGhpcy5xYj0iIjt0aGlzLnM9dGhpcy54Yz10aGlzLkNiPSExO3RoaXMuVWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlZlPSIifWMuVmo9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5PLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sYm06ZnVuY3Rpb24oKXtpZighdGhpcy5VZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm5hKXt2YXIgYT10aGlzLm9yaWdpbi5uYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5VZT1hW2RdKX1yZXR1cm4gdGhpcy5VZX0saGg6ZnVuY3Rpb24oKXtpZih0aGlzLlZlKXJldHVybiB0aGlzLlZlO3ZhciBhPSIiOyhhPXRoaXMuYm0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlZlPWF9LGxtOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2NdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Wanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5PaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXttZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixOYToiWE1MX1BBUlNFX0VSUk9SIn0sZGc6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGVkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGhnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApOYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTmE6IkxPQURfRVJST1IifSxpZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKenA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTmE6Ik1FRElBRklMRV9FUlJPUiJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE5hOiJEVU1NWV9BRCJ9fSxGPXtmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE5hOiJOT19BRFMifSxnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTmE6Ik5PX01FRElBRklMRVMifSxBcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGxlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Laj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBXYT1jLktqfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnpkPWM7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmRqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLk5sfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuYWk9YTt0aGlzLnZpZGVvPWM7dGhpcy5hZT1bXTt0aGlzLlloPVtdO3RoaXMub2Y9W107dGhpcy5mcD0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLkJwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYWkubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5haVthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLnRxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Wbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Nbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuYWUucHVzaCh7c3JjOmQsZnJhbWU6aCx2bjplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5vZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLm9mW2NdO2QudHlwZT09PWEmJmQuZmwodGhpcy5XbChhKSl9fSwKV2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7Q3E6ITAsQnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7cXE6InZpZGVvIixGcToianNDdXN0b20iLEdxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsSHE6MSwkcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LAprbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuYWUubGVuZ3RoO2MrKylpZih0aGlzLmFlW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYWVbY10udm47cmV0dXJuIiJ9LFZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5ZaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5rbShjKSx2ZW5kb3I6Y30pO3RoaXMudm8oKX0sTW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLmZwLm1hcChmdW5jdGlvbihhKXt0aGlzLnlnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMueWcoYSxjKX0seWc6ZnVuY3Rpb24oYSxjKXt0aGlzLm9mLnB1c2goe3R5cGU6YSxmbDpjLHpxOiExfSl9LHZvOmZ1bmN0aW9uKCl7dGhpcy5ZaC5tYXAoZnVuY3Rpb24oYSl7YS5JbXx8KGEuc3Eoe2FkU2Vzc2lvbklkOmUuWSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuRHEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5JbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLlhrfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLnJiPWEuZWgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWSgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy56Zz0hMTsKdGhpcy5lYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxDbzpmdW5jdGlvbigpe3RoaXMuemc9ITB9LHhpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkdjLHRoaXMuYy5sKCkpfSxZbjpmdW5jdGlvbigpe3RoaXMuemd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay52ZCx0aGlzLmMubCgpKSl9LElmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnJiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5yYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLnJiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMucmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5yYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5yYik7CnRoaXMuYy5YYyYmdGhpcy5jLlhjKCk/dGhpcy5jLmVoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sc206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGxjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5yYik7aWYoYy54IT10aGlzLkhhLnh8fGMueSE9dGhpcy5IYS55fHxjLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLkhhLndpZHRofHxjLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuU2UoKTtyZXR1cm59dGhpcy5IYT1jO3RoaXMuYy5YYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmVjLmxlbmd0aDthKyspdGhpcy5lY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLk5mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGMuYmluZCh0aGlzKSwxMCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLmVjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5lYy5wdXNoKGEpfSxTZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ybj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMucm58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5PZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sT2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGJiPWMuUGp8fGJiOyhmdW5jdGlvbihjKXtjLk9qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuYmM9dGhpcy5iY3x8ITE7dGhpcy5wZz10aGlzLnJnPQp0aGlzLndoPXRoaXMudmE9dGhpcy5TZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5TZj0hMDt0aGlzLndoJiZ0aGlzLkdnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuS2I7YSYmYS5uYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpOwp0aGlzLkNnKCl9LEdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmMpe3RoaXMudGQoKTtpZighdGhpcy5TZiYmIXRoaXMudGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlNmJiZ0aGlzLnBnJiYhdGhpcy5yZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19LHRkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxraDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxDZzpmdW5jdGlvbigpe2lmKHRoaXMudGQoKSl7dmFyIGE9CnRoaXMua2goImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5yZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnBnPWEuWHB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2coKX0uYmluZCh0aGlzKSwxMDApfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5vcSgpOiExfSxLYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuS2MoKTotMX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sS2w6ZnVuY3Rpb24oYSxiKXt0aGlzLmJjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLmJjfHwzMDI9PXRoaXMuYmM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuYmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuV2UoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5lbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBjYj1jLk9qfHxjYjsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEttOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlpqLkZrLkRrP3dpbmRvdy5PTy5aai5Gay5Eay5WcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5QZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGNiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlFqfHxkYixlYj1uZXcgZGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5FbHx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5uaCgpfSxuaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE1hOmZ1bmN0aW9uKCl7dGhpcy5UaCgpfSxUaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVml8fGdiOyhmdW5jdGlvbihjKXtjLlVpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRGcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlVpfHxoYjsoZnVuY3Rpb24oYyl7Yy5XaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFdoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLldoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5XaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLldpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLldrfHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5paz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxYYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuaWt8fFU7KGZ1bmN0aW9uKGMpe2MuaGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5tZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp3Lm1kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubm4oYSl9LmJpbmQodGhpcykpO3cubWQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5tZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0sbm46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5pYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLktkJiYoYT1lLkRsKGEsdGhpcy5LZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk0oZCkpe3RoaXMuTihkKTsKdmFyIGc9bmV3IFYoZCx0aGlzLkcpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLktkfHwodGhpcy5LZD1bXSksdGhpcy5LZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGc9bmV3IFYoZCx0aGlzLkcpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbWQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0sTm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5TY3x8Cih0aGlzLlNjPVtdKSx0aGlzLlNjLnB1c2goYSksdGhpcy5YbigpJiYodGhpcy55ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuU2MpZm9yKHZhciBhPTA7YTx0aGlzLlNjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuU2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5ObyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Tbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMuU298fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5SaXx8bWI7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuU2l8fApuYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuTShoKXx8KHRoaXMuTihoKSwobmV3IG5iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlRpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5ra3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLkljPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9CiEwKTt2YXIgYj10aGlzLlZnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5JYz1iKTtpZighdGhpcy5JZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRWQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVihiKTt0aGlzLkxuKHRoaXMuZ2V0UmF3UGxheWVyKCksCmEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHdnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTt0aGlzLmdjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5nYyYmdGhpcy5nYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdHJ5e3RoaXMuZ2NbYV0oKX1jYXRjaChiKXt9fSxFZDpmdW5jdGlvbigpe2lmKHRoaXMuSWMpcmV0dXJuIHRoaXMuSWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVmcoYSkpcmV0dXJuIHRoaXMuSWM9YX19LFZnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxMbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCwKZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS51bm11dGUmJgp0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0seGg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Nanx8cmI7KGZ1bmN0aW9uKGMpe2MuTGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5FZCgpP3RoaXMuQygpOih0aGlzLkhlfHwodGhpcy5IZT0xKSx0aGlzLkhlKyssMTAwPHRoaXMuSGU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Manx8c2I7KGZ1bmN0aW9uKGMpe2MuTmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyBzYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Oanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy5ranx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sCk1hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudmt8fHZiOyhmdW5jdGlvbihjKXtjLnVrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxKbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPQpbXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5CYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkpuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuTWMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7CnJldHVybn1pZighdGhpcy5CYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudWt8fHdiOyhmdW5jdGlvbihjKXtjLndrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTsKdGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgd2IoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMud2t8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLndtfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5zZj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTAwKX0sQW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5XJiZ0aGlzLlcoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx5bzpmdW5jdGlvbigpe3RoaXMuc2Y9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudGM9MH0sZjpmdW5jdGlvbigpe3RoaXMuJG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnRjfHwodGhpcy50Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy50Y3x8dGhpcy50YysrLHRoaXMudGM8PXRoaXMuJG0/KHRoaXMudGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnlvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQmI9Yy5ja3x8QmI7KGZ1bmN0aW9uKGMpe2MuZWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkcpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy55cHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5HYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUW0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm5nKCl8fHRoaXMuaSghMCl9LFFtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HYigpOyFhLnBhJiZhLlgmJmEuVXAmJmEuV3AmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2IoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZmQuR2IoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXS5pZD09YiYmKHRoaXMuTmg9YVtmXSk7cmV0dXJuIHRoaXMuTmh9LHBxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5HYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5mZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmZkLkdiKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmZkLkdiPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5mZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5wbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMucG58fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVihiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxucTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApYYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Ianx8WDsoZnVuY3Rpb24oYyl7Yy5Haj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnRmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMudGYmJmMhPXRoaXMudGZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuRCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEudXEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkdqfHxZOyhmdW5jdGlvbihjKXtjLklqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy55ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLklqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLk5pfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlYoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sZGk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGtuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0sQWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5BZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE9iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMudW58fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLllpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVihiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxkaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxrbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLllpfHxTYjsoZnVuY3Rpb24oYyl7Yy5aaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkFlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWml8fFRiOyhmdW5jdGlvbihjKXtjLiRpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgU2IoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBUYihjLHRoaXMuRykpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuJGl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLnFufHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlYoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxLbjpmdW5jdGlvbigpe3RoaXMuZGQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5kZHx8KHRoaXMuZGQ9ITAsdGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZGQmJih0aGlzLlpkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZGQ9ITEpLHRoaXMuWmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLnprfHxYYjsoZnVuY3Rpb24oYyl7Yy55az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmZjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5mYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGguYmluZCh0aGlzKSwxMCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuR2s9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkdrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxrZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5mYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2cuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5YaCgpO3RoaXMua2coKTt0aGlzLk5uKCl9LE5uOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuSG4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuSG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5mYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy55a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5LbigpLGE9bmV3IFliKGEsCnRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkFrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuVGt8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm5rPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZW49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGRpOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZZChhKX0uYmluZCh0aGlzKSl9LFlkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBOPWMubmt8fE47KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5MZSlpZih0aGlzLk1ifHwodGhpcy5NYj0wKSx0aGlzLk1iKyssMTU8dGhpcy5NYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5tbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLndiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5ta3x8TzsoZnVuY3Rpb24oYyl7Yy5vaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnlmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5va3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMueW58fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkNqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5WKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuQ2p8fFo7KGZ1bmN0aW9uKGMpe2MuQmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5PYz10aGlzLkJhPXRoaXMub2Q9ITE7dGhpcy5WaD1lLlFiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2IoKT8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkJqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Eaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkRqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy52bXx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVihiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5panx8aGM7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5oanx8aWM7KGZ1bmN0aW9uKGMpe2Muamo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmdhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmpqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Wa3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuemUoKTt0aGlzLkJnKCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemUuYmluZCh0aGlzKSwxMDApfSx6ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnplLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlVrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuTWQ9W107dGhpcy54Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5mbShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmNpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy54Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMueGZbZF07dGhpcy5XZihjKSYmKHRoaXMuTWQucHVzaChjKSx0aGlzLmNpKGMpKX19LFdmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0sZm06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMueGZbZF0sdGhpcy5XZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxjaTpmdW5jdGlvbihhKXt0aGlzLldmKGEpJiZhLmYoKX0sQW86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuTWQubGVuZ3RoO2ErKyl0aGlzLk1kW2FdLlhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTWRbYV0uWGIpfX19KShjKTt2YXIgcmM9CmMuWGp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuSmp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZS5KYyhrLlhvKSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5KYyhrLmpuKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHhjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksdmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbD0hMTtILmZhKCk7SC55aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnloKCksCmZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmEoKTt2YXIgeWM9eGMoZnVuY3Rpb24oKXtlLllnKHdpbmRvdyxILkFtKCkse2lkOnljfSl9LDUwMCksaWE9ZS5ZKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Daz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuQ2t8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5TaD10aGlzLmNvbmY9dGhpcy5KYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSWQ9MDt0aGlzLmViPSIiO3RoaXMuTmQ9W107dGhpcy5PZD0wO3RoaXMuVWg9ITE7dGhpcy51Zj1bXTtlLnViKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtpbzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPQphO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGNvOmZ1bmN0aW9uKGEpe3RoaXMuSmI9YX0sYm86ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gY30sWWM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuQm0oKSl0aGlzLkpiLmcodGhpcy5KYi5OYyx0aGlzLkpiLnFhLHRoaXMuSmIud2YsZnVuY3Rpb24oKXt0aGlzLlljKGEsYyl9LmJpbmQodGhpcyksdGhpcy5KYi5oYyk7ZWxzZSBpZih0aGlzLnBtKCkpdGhpcy5abihmdW5jdGlvbigpe3RoaXMuWWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkdjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLGw9Cm5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuQ28oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS51YigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBRYShsLHRoaXMuSmIsaCk7bC4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWm0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5kZiYmKGQ9dGhpcy5wbGF5ZXIuZGYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZmYoYSxkLGcpO3RoaXMucGxheWVyLmZpKGwpfX0sQm06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5JZClyZXR1cm4gYz1hLmdldFRpbWUoKS0KdGhpcy5JZC5nZXRUaW1lKCksdGhpcy5JZD1hLDNFNTxjPyEwOiExO3RoaXMuSWQ9YTtyZXR1cm4hMX0sc286ZnVuY3Rpb24oKXtlLnViKCJwcmVyb2xsIik7ZS5EZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlVnKGEpKT90aGlzLlljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlNoKXtlLkRmKCJwb3N0cm9sbCIpO2UudWIoInBvc3Ryb2xsIik7dGhpcy5pbyghMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7CihkPXRoaXMuVWcoZCkpP3RoaXMuWWMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9fSxVZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sUm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbyh0aGlzLnJvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk1hKCl9LFNkOmZ1bmN0aW9uKGEpe2UudWIoIm1pZHJvbGwiKTtlLkRmKCJtaWRyb2xsIik7aWYoIXRoaXMuSGgpe3RoaXMuSGg9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuWWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGg9CiExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnZkLHRoaXMucGxheWVyLmwoKSkpfX0sUW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmpmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLnNvKCk7dGhpcy5wbGF5ZXIuamYmJnRoaXMuUW4oKTt0aGlzLlJuKCl9LFNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGYpe3RoaXMuTmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmtiKGEsYixjLGYsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsCmFbY10ubWFjcm8pfXRoaXMuT2Q9dGhpcy5OZC5sZW5ndGh9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLk9kJiYoYT0hMCk7cmV0dXJuIGF9LFpuOmZ1bmN0aW9uKGEpe3RoaXMuVWg9YTtmb3IoYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fbi5iaW5kKHRoaXMpKX0sRW46ZnVuY3Rpb24oYSl7dGhpcy5PZC0tO2EmJnRoaXMudWYucHVzaChhKTswPj10aGlzLk9kJiZ0aGlzLlVoKCl9LFptOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLnVmLmxlbmd0aDtkKyspYz10aGlzLnVmW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLkxpfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucGt8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoeG9vU2VpaG9BY2hhYWNoaSx4b29TZWlob0FjaGFhY2hpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.90.4
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.4.90.243.136.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- d570e4900671048879eec90038e054c605437225d0c3a6c249d9ab2b6f95f89c
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame ADFF
|
0
0
|
68ms
68ms
|
Fetch
image/gif |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsudDfVzce_8ZuDCiLHeynmLEXMek5Ar4egDrXrLB3f0juMkAr6UWYx_s-Tym_qDQZ25BFU4DCvh1mEYR8-exu6-jXVzq7Q36Zus9Z2XsEp1N2Q6y-ZxJANSmX8PSyVyDDVVjaJT24Mi20tLgY0c6AH4OCP-_JOzusyUxDgKUzVRX_HGZPdz5d7RJf6Q9OfZgQI-Rpqqq0PnwE7Py95wblJpk-Gd-7FvGYKKY-ChDHKbTErrCcYfzw1BSJFhPmiGei3d4UnTmmEklAb65riOSuxDfKaW&sig=Cg0ArKJSzGxBTyJ9Qo9EEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame ADFF
|
72 KB
27 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2bbe4d4e1a168926c878be73ce8e09b71e70f3823575de43e0623a4e2dfb609d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
imgad
tpc.googlesyndication.com/pagead/
Frame ADFF
|
137 KB
137 KB
|
7ms
7ms
|
Image
image/jpeg |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDnsN23GRABGAEyCNU3OXQ3SRQn
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- b555a8802244b241591af02b0b7dc63d6d3d14d25163596f995e5bafe5db999c
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame CB02
|
0
0
|
69ms
68ms
|
Fetch
image/gif |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstKBSAPPmhV3VL7UuFmBwXqSON_5OMXq3ciNqJm4VwYYtbf7D-1sxRu3GHTnqaUnTfy8dCYTedSzTrxJn26NnlS8tbVNP99o7GE7k_A3C5T2hPmRl8wb4LZbr7ugnoUUIw1pU4CLIxK7bD_q7t0zzZ95EXHfLyxyCO692AXTM8qXpVnduKj4cCiXY4F739rPGsGhgV6qOxQEA1zt0CBCGKZpIPBSBQsNfYxilh5ZE1ZN9TICbp7_ls8Wt9TKsUB76rc2l-SauYG2JoA99slGGpF8JWm&sig=Cg0ArKJSzDL7E0q7xo4FEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
Frame CB02
|
43 KB
14 KB
|
64ms
64ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame CB02
|
72 KB
27 KB
|
41ms
41ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2bbe4d4e1a168926c878be73ce8e09b71e70f3823575de43e0623a4e2dfb609d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame A4A5
|
0
0
|
69ms
68ms
|
Fetch
image/gif |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstPwRjXpAH9wQ-6_4UxVI0DDIoWN2aTlk61EYTFOPTr5W9NnW2TNoe2EP1iPRaptuK7VL4AGOKhkU_FJ9t0hMkonE6JMdddx1aaXRSqKGVRh6dtJBs1PIW-ABD2Uxfh-4ppcfJTNIw7xVNqcSqpw8mW-20RDbiAnZj1enER7Jptn6IQ6Sd7bG7LFEF_9dVGMFt1Npl5TYTRGqoYiCGF-5w3hB_Oj7_8aunR6g1JG4B2QUeQZEZG5sJSE7LqVQd2VyGxlSQ7k11lyEnAIxZA0NquUz7T&sig=Cg0ArKJSzHog6kly9t1kEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
Frame A4A5
|
43 KB
14 KB
|
64ms
64ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame A4A5
|
72 KB
27 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2bbe4d4e1a168926c878be73ce8e09b71e70f3823575de43e0623a4e2dfb609d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame F33B
|
0
0
|
71ms
70ms
|
Fetch
image/gif |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvihsukGNtnr4Ep82YdDO01FnX8vt8yXTZEqu2gNgUT35iAXlr0P_zTqOsqFl9VlSws9tvKCG7DThqBT1bwsasYLF7j5zS3R-Hr2AjcuwMf8dy0merenphq1flzR1bHJqKur0xt2yKNxPRhZXBhzTrokPnuAZh_4GvRac5Fkz61UpvUisaKPQsd8a0Z5VoUqRTdq3CIFUFOSGumljzfu4Kh90xFjpAngj0E5apjasmz4GxjGnV9LBNGzqN6J6T0BrsdAioWgjOSzov89QzI3xtRTI3P&sig=Cg0ArKJSzHt_WEGbFAVNEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
Frame F33B
|
43 KB
14 KB
|
65ms
65ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame F33B
|
72 KB
27 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2bbe4d4e1a168926c878be73ce8e09b71e70f3823575de43e0623a4e2dfb609d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
securepubads.g.doubleclick.net/pcs/
Frame 444A
|
0
0
|
68ms
68ms
|
Fetch
image/gif |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssfUCr22ihSGcpfT9dMQYMqsJQeHlJI8g4d1X4iE7MQMhuqo9W-acapw-20kLzfFLgx6bD9iFYJBxRBIzD7BcolBs59NjfKV2x8yHQJo8fDTqtbOZrnCaXrtANyJQLckBFnva_KkYzaaAY9DkPSmN-UYUAFdXd50cw3B30nm9ti0QMpE2BodBx2fmCRUp0lNSMwXvoIdIqAy4ctPFFI0qCh9E53UGus6UNll1dXTuYx3vxEVpwpnO2yG6w9SGZ4LZnoBG-mCbF7qWhZuXEMj45qIVPX&sig=Cg0ArKJSzBelvo-v5EwHEAE&urlfix=1&adurl=
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
Frame 444A
|
43 KB
14 KB
|
67ms
66ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 444A
|
72 KB
27 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 2bbe4d4e1a168926c878be73ce8e09b71e70f3823575de43e0623a4e2dfb609d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
5299609354
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
248 B
|
92ms
30ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
4889797896
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
206 B
|
92ms
30ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
4889680744
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
206 B
|
91ms
29ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
4890373424
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
102ms
40ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
4889801247
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
2 B
205 B
|
92ms
31ms
|
XHR
application/json |
52.57.208.4
AMAZON-02
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
89ms
28ms
|
Script
text/plain |
89.163.159.120
MYLOC-AS
|
|
General
- Full URL
- https://api.theadex.com/v0.9/pub/segments?access_token=y5fWjpPcqPTEF7fuHtSSUIh1UnD1w2hVEt2Y2PjI&callback=window.ibb_lib.ibb_store
- Requested by
- Host: bbcdn-bbnaut.ibillboard.com
URL: https://bbcdn-bbnaut.ibillboard.com/library/ibb_map.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
89.163.159.120
Cloppenburg, Germany,
ASN24961
(MYLOC-AS, DE),
- Reverse DNS
- Software
-
/
- Resource Hash
- 893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
5 KB
|
21ms
6ms
|
Script
application/javascript |
2600:9000:20eb:6200:1c:8c89:a300:93a1
AMAZON-02
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.golem.de/
|
24 B
356 B
|
107ms
32ms
|
Script
application/octet-stream |
136.243.90.4
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHhvb1NlaWhvQWNoYWFjaGk9eG9vU2VpaG9BY2hhYWNoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucGZ8fCh3LnBmPTApO3cucGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5wZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZWEoKXtpZighbCl2YyhlYSw1MCk7ZWxzZSBpZighZS53bil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmRsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkdjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uQ2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5FZihjKTtiLmNvKG0pO2IuYm8obCk7Yi5TbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0uemIubGVuZ3RoKXt2YXIgYj1tLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGY7Zj1lLmxvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2ZbIltMT0FEU0NSSVBUXSJdXT1lLkZoLmJpbmQoZSk7d2luZG93W2ZbIltVVElMU10iXV09bTtmb3Iod2luZG93W2ZbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBmIGluIGIpbFtmXT1iW2ZdO3QoYyxhKX07Zj1iLnNjcmlwdHMuc2hpZnQoKTspZS5GaChmLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLkxiPSJzZXR1cCI7dGhpcy5aYz1bXTt0aGlzLkNlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRG4uYmluZCh0aGlzKSk7dGhpcy50Yj17fTt0aGlzLnJoPXt9O3RoaXMuQmY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy50Yil0aGlzLnRiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy50YlthXSsiXyIpO3JldHVybiBifSxrYzpmdW5jdGlvbigpe3RoaXMuQmZ8fCh0aGlzLkJmPWUuWSgxMCkpO3JldHVybiB0aGlzLkJmfSx1YjpmdW5jdGlvbihiKXt0aGlzLnRiW2JdfHwodGhpcy50YltiXT0wKTt0aGlzLnRiW2JdKz0xOzU8dGhpcy50YltiXSYmIXRoaXMucmhbYl0mJih0aGlzLnJoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxDZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxEbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5DbihiLmRhdGEpfSxDbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx3ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5RYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGdoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuT2woYikpcmV0dXJuOyhhPXRoaXMuTmcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxYZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sTW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZmg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sR2Y6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5BbChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9nPWNbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmdsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE5mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LEFoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFllOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZyk7Yz49YSYmKGU9ITApO3JldHVybiBlfSxaZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlllKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlplKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFFiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxSZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSGY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZis9Zy50b1N0cmluZygxNik7cmV0dXJuIGZ9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcD1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO3A9ZTtuPWg7bD16O3k9azt0PW07Zm9yKGc9MDsxOT49ZztnKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZz02MDs3OT49ZztnKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eitsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxwYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGc+PjQsZT0oZyYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZyk/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sSG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxBZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZWM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxwKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1wO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sWGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sdW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sUmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlFpKCl8fApiLlhpKCl8fGIudW0oKXx8Yi5SaigpfHxiLnhrKCl8fGIuRWooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuWmsoKX0sVGw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGYpe2EmJihkLnF1ZXJ5S2V5W2FdPQpmKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHA9Yi5sZW5ndGg7ZzxwOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxnbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LERsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxnLnB1c2goYltwXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocCl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sYWg6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy53aShhKSsiOiIrdGhpcy53aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sd2k6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LERmOmZ1bmN0aW9uKGIpe3RoaXMuTGI9Yn0sWWc6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5MYjt0aGlzLnRlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChwKXt0aGlzLnduPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEpjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5ZZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxwLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtwJiYoeD1rLlNhKHgscCkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtlLkpjKHgpfSxGbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5rYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudGUoYil9LHRlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRm4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0ucGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLkthKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bS5wYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShnLCEwKTtnPW0ud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxiZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPW0ucGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bS53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTttLkthKGQpfX0sZ2Y6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0ubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2YoKX0uYmluZCh0aGlzKSw1MDApfSxOZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMuc2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxRZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sc2I6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5GZChiKToiIn0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5RZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS4kZShiKXx8dGhpcy5NbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnpmJiZ3aW5kb3cuc2FuZGJveC56ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5YZyhiKSlyZXR1cm4gdGhpcy5YZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9CiExfWUudXJsJiZlLmhhc2gmJihlPWEuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUGsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZyxjLGUsaCx4KXt2YXIgaz1lfHxtO2U9ITA7eCYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGUsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxnLGMsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFFjOmZ1bmN0aW9uKGIsYSxkLGcsYyxlLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5RYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuWmMpZm9yKHZhciBjIGluIHRoaXMuWmMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5aY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5iYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlVtKGcuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlpjPWJ9LGtiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuaG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudnA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5HbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnhwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnRnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmxnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5xZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS51Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Eub2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5icD17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkhsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS52ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkdjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Euc2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5sZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Euc2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLklrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5EaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmxuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ybz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLnltfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e1JlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZz1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5EZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkRkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5SZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LEFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuUmUodGhpcy5jbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLApkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5EZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihmKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBmKWdbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBmW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGZbY10pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBmPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZjtyZXR1cm4gZ319KGMsZltjXSk6ZltjXTtmPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zi5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWY7Zi5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGZ9O2MuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1uPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5tbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Xaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLkxhPQp7fTt0aGlzLkc9bnVsbDt0aGlzLlZjPTEwMDt0aGlzLlJiPTA7dGhpcy5WYT0xNTA7dGhpcy5YYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlJiPD10aGlzLlZhPyh0aGlzLlJiKyssdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSk6MD50aGlzLlZhJiYodGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSl9LFhuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmI+dGhpcy5WYT8hMDohMX0seWY6ZnVuY3Rpb24oKXt0aGlzLlJiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxlbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5qYSgpXT1hO0wmJkwuRWgmJkwuQW8oYSl9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIGUuUGUodGhpcy5MYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZjtmb3IoZiBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZl0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX0sR206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx5cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLldqfHxxOyhmdW5jdGlvbihjKXtjLllqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVmM9MTA7dGhpcy5SYj0wO3RoaXMuVmE9NTA7dGhpcy5XPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuS2I9IiI7dGhpcy5QZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZj10aGlzLlRhKCksCmQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZilhLmNvbnRhaW5lcklkPWYuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5XPWF9LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV30saG86ZnVuY3Rpb24oYSl7dGhpcy5rZj1hfSxncTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtmfSxqZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUmI8PXRoaXMuVmEmJih0aGlzLlJiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5WYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxBcTpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5xbSgpfHx0aGlzLkxrKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApqcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sVTpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFhjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxkZjpmdW5jdGlvbigpe3JldHVybiExfSxmaTpmdW5jdGlvbihhKXt0aGlzLktiPWF9LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2J9LCRoOmZ1bmN0aW9uKCl7dGhpcy5LYj1udWxsfSxscTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuS2ImJihhPSEwKTtyZXR1cm4gYX0sdnE6ZnVuY3Rpb24oKXt0aGlzLlBnfHwodGhpcy5QZz0hMCl9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5Zanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmlnPSIxIjt0aGlzLmpnPSIyIjt0aGlzLkVrPSIzIjt0aGlzLmdkPTA7dGhpcy5ibj0zMDt0aGlzLmFjPVtdO3RoaXMubGI9W107dGhpcy52Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy52Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuZ2Q7dGhpcy5pZD1lLlkoMTApO3RoaXMuRWYoYSk7dGhpcy5mbyhiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxlLmdmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx6bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmtjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5rYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV09MX0sRG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZj1uZXcgSTt3aW5kb3dbZi5mYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUua2MoKSYmKHRoaXMuRmYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBmPSEwO2EmJihmPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnptKCk7CmlmKCF0aGlzLkRtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkZmKCk7cmV0dXJufXRoaXMuRmYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxmKTt0aGlzLnNpKCk7dGhpcy52Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5hYy5wdXNoKGEpLHRoaXMubGIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHNpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5hYyYmMDx0aGlzLmFjLmxlbmd0aCYmKHRoaXMuYWM9ZS51bmlxdWUodGhpcy5hYyksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYWMuam9pbigiLCIpKSk7aWYodGhpcy5sYil7Zm9yKHZhciBmPTA7Zjx0aGlzLmxiLmxlbmd0aDtmKyspdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl09PXRoaXMudmNbYV0mJmIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl08CnRoaXMudmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksYT10aGlzLmxiW2ZdLnJlYXNvbik7dGhpcy52Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihmPWUudW5pcXVlKGIpLGE9YSsiLSIrZi5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlnfSxGZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuamd9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Fa30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmdkfSxuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5pZ30sU3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmdkfSxFZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5UcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLnNufHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMudmI9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5XZygpO3RoaXMuS2UoKTt0aGlzLnhsPSExfSxXZzpmdW5jdGlvbigpe3RoaXMudmI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnZiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5LZSgpO2lmKHRoaXMudmIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxLZTpmdW5jdGlvbigpe2lmKCF0aGlzLnZiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMudmI9ITApO3RoaXMuVihiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5XJiYoMCx0aGlzLlcpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmtmJiYoMCx0aGlzLmtmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy56anx8c2E7KGZ1bmN0aW9uKGMpe2MueWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5nZDt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5yZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkViPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGY9MDtmPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2YrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ZdLnRhZyl7dGhpcy5FYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkViPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkViPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuRWI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGY9MDtmPApkLmxlbmd0aDtmKyspYS5vbihkW2ZdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZl0mJih0aGlzLnBlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZl0mJnRoaXMuTGgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuRWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuS2I7YiYmKGIuTGQoKSxiLndkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5oZC5pbmRleE9mKGIpJiZ0aGlzLmhkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5oZC5sZW5ndGg+PXRoaXMucmUmJnRoaXMuaSgpKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5KZT90aGlzLkplKys6dGhpcy5KZT0xOnRoaXMuSWU/CnRoaXMuSWUrKzp0aGlzLkllPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLk5mKGIudmlkZW9UYWcpP2IudmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5wZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSWU+dGhpcy5KZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLldnKCksYi5LZSgpLGIudmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy55anx8dGE7KGZ1bmN0aW9uKGMpe2MuQWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZiYmZigpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGY9MDtmPGIubGVuZ3RoO2YrKylhLnB1c2goYltmXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBmPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpmLnZifHx0aGlzLk0oZil8fHRoaXMuR20oZil8fCh0aGlzLk4oZiksZj1uZXcgdGEoZix0aGlzLkcpLGYuSigpLGYuZigpKX19dGhpcy5QKCl9fSxlcTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUucGIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkZqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWWQoYSl9LmJpbmQodGhpcykpfSxZZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5XJiZ0aGlzLlcoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGYpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGYpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuT2M9dGhpcy5CYT10aGlzLm9kPSExO3RoaXMuVmg9ZS5RYigxMCk7dGhpcy5VZj0hMDt0aGlzLkJjPXRoaXMudmg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksdGhpcy55YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlgsIjsiLHR5cGVvZiBhLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWD9hLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlg/dHlwZW9mIGEuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5JYT9hLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILklhP3R5cGVvZiBhLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5uZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm5lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC54ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlZoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApNYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkxjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saWg6ZnVuY3Rpb24oKXtpZighdGhpcy5PYyl7dmFyIGE9dGhpcy5MYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk9jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5PYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk9jfSxFbTpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLkNtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxDbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2QmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLm9kPSEwKTtyZXR1cm4gdGhpcy5vZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGY9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihmPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe3RoaXMuUG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sUG46ZnVuY3Rpb24oKXt0aGlzLkJjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixmPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihmPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7aWYoZS5EKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO2UuRCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxjcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5MaCgpfS5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuRW0oKSl7dmFyIGI9dGhpcy5MYygpLGY9dGhpcy5NYygpO2ImJmYmJih0aGlzLkJjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudmg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCksYT10aGlzLk1jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZj0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilmPSEwO2Z8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmCmIoZi5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5IY3x8KHRoaXMuSGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkhjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5IYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp3YjpmdW5jdGlvbigpe3JldHVybiBlLkdlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGUuRCgiZ2lnYS5kZSIpfHxlLkQoInNwaWVsZXRpcHBzLmRlIil8fGUuRCgia2luby5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSl0aGlzLlVmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5EKCJnaWdhLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLlFjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuVGwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkdlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlVmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlVmLGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMubXF8fCgxMDx0aGlzLmhwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmhwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuV24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sV246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaXApe3RoaXMuaXA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5ya3x8eWE7KGZ1bmN0aW9uKGMpe2MudGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmppKHdpbmRvdyk7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspdHJ5e2I9Ynx8dGhpcy5qaShhW2ZdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxqaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGUuUGUoYikpe2Zvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihhPW5ldyB4YShiW2ZdKSxhLmdhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy4kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5xZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlYoYSk6dGhpcy5VKCl9LHpuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2IsZj10aGlzLmphKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLm5jJiYoMDw9Zi5pbmRleE9mKGQpfHxiLkxkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5xZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMucWYrKztpZigxMDx0aGlzLnFmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sCllkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgUj1jLlRqfHxSOyhmdW5jdGlvbihjKXtjLlNqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGUpaWYodGhpcy5NYnx8KHRoaXMuTWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5NYisrLDE1PHRoaXMuTWIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5MZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMud2IoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBmPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWY9ITA7Znx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmYihmLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkpsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5KbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS56bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuU2p8fENhOyhmdW5jdGlvbihjKXtjLlVqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZj1uZXcgUihhW2JdKTtmLmdhfHx0aGlzLk0oZil8fCh0aGlzLk4oZiksCihuZXcgQ2EoZix0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVWp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnhtfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5maChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkJuPWEucG9zaXRpb25pbmc7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS53aWR0aD1hLndpZHRoO2Yuc3R5bGUubWluV2lkdGg9CmEud2lkdGg7Zi5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Yuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQm4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGYpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmLGIpfXRoaXMuVChmKTt0aGlzLlYoZik7dGhpcy5CZD1mfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkJkKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtlLkFoKHRoaXMuQmQpOwplLlllKHRoaXMuQmQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxkZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMud2p8fEdhOyhmdW5jdGlvbihjKXtjLnZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLnZqfHxJYTsoZnVuY3Rpb24oYyl7Yy54aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5maChhLCJlbGVtZW50SUQiKTtpZihlLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy54anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuRmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE1rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuJGc9dGhpcy5HaT0hMTt0aGlzLk1oPWQ7dGhpcy5raT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJm0mJm0uYWYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuJGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuamIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmtpP3RoaXMuamIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5qYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5qYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbSYmbS5hZih0aGlzLkZhLnVybCkmJiFiP2UudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTptLmFmKHRoaXMuRmEudXJsKSx0aGlzLk1oJiZ0aGlzLk1oKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5rZT0hMX1jLmJqPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMua2U9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxVbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXtDcDoiQWRDbGlja1RocnUiLEVwOiJBZEVycm9yIixGcDoiQWRTdG9wcGVkIiwKSXA6IkFkTGluZWFyQ2hhbmdlIixKcDoiQWRUYWdQYXJzZWQiLE1wOiJBZFZpZGVvQ29tcGxldGUiLFBwOiJBZExvYWRlZCIsUXA6IkFkU2tpcHBlZCIsUnA6IkFkU3RhcnRlZCIsR3A6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixIcDoiQWRJbXByZXNzaW9uIixEcDoiQWRDcmVhdGl2ZVZpZXciLEtwOiJBZFZpZGVvTWlkcG9pbnQiLExwOiJBZFBhdXNlZCIsTnA6IkFkVmlkZW9TdGFydCIsT3A6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5rZSxhW2RdKX0sVG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmplKWZvcih2YXIgYSBpbiB0aGlzLkdhLmplKXRoaXMuR2EuamUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5qZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMua2UmJnRoaXMuVW4oKTt0aGlzLkdhJiZ0aGlzLlRuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5vYj0iIjt0aGlzLnBkPXRoaXMuZGM9dGhpcy5uYj1udWxsO3RoaXMuU2c9dGhpcy56Yj10aGlzLmNmPSExO3RoaXMuQWE9IiI7dGhpcy5iZj0hMTt0aGlzLnFhPXRoaXMuTmM9IiI7dGhpcy5YZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy53Zj0hMTt0aGlzLmhhPVtdO3RoaXMuVGU9dGhpcy5UYj0iIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuZ2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5CYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy4kYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5VYj0iIjt0aGlzLlZiPVtdO3RoaXMuV2I9W107dGhpcy5hZD1bXTt0aGlzLnNjPSIiO3RoaXMuRmI9ITE7dGhpcy5YZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm1jPSExO3RoaXMuSGc9dGhpcy5iZT1udWxsO3RoaXMuSmY9dGhpcy5oYj10aGlzLlJnPXRoaXMuJGQ9dGhpcy5WZj10aGlzLnJkPXRoaXMud2M9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5HZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5EYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmpkPXRoaXMua2Q9IiI7dGhpcy5rYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5XYz1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsCmFkdGFncGFyYW1ldGVyOnRoaXMub2IsYWR0YWdtb2RpZmllcjp0aGlzLm5iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5kYyxhZHRhZ3JlZ2V4OnRoaXMucGQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuY2Ysc2lkZWxvYWRzOnRoaXMuemIsZGlzYWJsZXRlc3RzOnRoaXMuU2csaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5iZixnbG9iYWxDb25maWc6dGhpcy5OYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuWGUsc2VydmVyOnRoaXMuaGEsc3ZtQ29uZmlnOnRoaXMuVGIsaG9tYWRBZHBhdGg6dGhpcy5UZSxIT01BRF9WRVJJRklFRDp0aGlzLmhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5nZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5CYixIT01BRF9BREJMT0NLRVI6dGhpcy4kYix0ZXN0SGlkZTp0aGlzLlViLHRlc3RUYWdzOnRoaXMuVmIsdGVzdFRhZ3NKUzp0aGlzLldiLAp0ZXN0VGFnc1hIUjp0aGlzLmFkLHRlc3QzUENvb2tpZTp0aGlzLnNjLHRocm90dGxlOnRoaXMuWGQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5tYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMud2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnJkLHVzZVN0cmljdENoZWNrczp0aGlzLlZmLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLiRkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMuQWYsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmFiLHZwYWlkOnRoaXMuaGIsc2tpcEFsbG93ZWQ6dGhpcy5KZix2bWFwczp0aGlzLiRmLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5EYyxhZEZhbGxiYWNrVVJMOnRoaXMua2QsYWRGYWxsYmFja0NvbmZpZzp0aGlzLmpkLHlpZWxkbGFiOnRoaXMua2J9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMub2I9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5uYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLmRjPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMucGQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5jZj1iLmpzcG9wdXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpZGVsb2FkcyYmKHRoaXMuemI9Yi5zaWRlbG9hZHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZGlzYWJsZXRlc3RzJiYodGhpcy5TZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYKKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmJmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLk5jPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNCbG9ja2VkJiYodGhpcy5YZT1iLmlzQmxvY2tlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXImJih0aGlzLmhhPWIuc2VydmVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuVGI9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5UZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5oZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmdlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLkJiPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuJGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJih0aGlzLlViPWIudGVzdEhpZGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3MmJih0aGlzLlZiPWIudGVzdFRhZ3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NKUyYmKHRoaXMuV2I9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYKKHRoaXMuYWQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnNjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5YZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5tYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5IZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkQmxvY2tlckRldGVjdGVkJiYodGhpcy53Yz1iLmFkQmxvY2tlckRldGVjdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnJkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5WZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLiRkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy4kYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMuQWY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYodGhpcy5hYj1iLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudnBhaWQmJih0aGlzLmhiPWIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLkpmPWIuc2tpcEFsbG93ZWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy4kZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkRjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tVUkwpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja0NvbmZpZyYmKHRoaXMuamQ9Yi5hZEZhbGxiYWNrQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnlpZWxkbGFiJiYodGhpcy5rYj1iLnlpZWxkbGFiKX0sb206ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmKGI9ITApO3JldHVybiBifSxDZjpmdW5jdGlvbihiKXt0aGlzLiRhW2JdPSEwfSxZbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxXZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5RYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLiRrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGc9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuJGUoYik7CmM9dGhpcy5hYShiKTtnPyh0aGlzLlBjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMub2J8fHRoaXMubmJ8fHRoaXMuZGN8fHRoaXMucGQpJiYoaD10aGlzLmRuKGgpKTtiPW5ldyBDKGUpO2IudXJsPWU7ZT0iIjtlPWc/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuJGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSwkZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlBjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxQYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5oYSYmdGhpcy5oYS5sZW5ndGgmJjA8dGhpcy5oYS5sZW5ndGgmJihhPXRoaXMuaGFbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sYWY6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy4kZShiKTtyZXR1cm4gYX0sCiRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLllwO3JldHVybiJub25lIn0sSGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYVt0aGlzLkFmXX0scGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhkKCksYT10aGlzLkhmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEloOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZyl7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxjbjpmdW5jdGlvbihiLGEpe3ZhciBkPWUuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPGgubGVuZ3RoO0IrKyl7dmFyIGs9aFtCXS5zcGxpdCgiPSIpO2dba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZ1tsXT10aGlzLkloKGdbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5JaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGRuOmZ1bmN0aW9uKGIpe3RoaXMub2ImJgooYis9dGhpcy5vYik7aWYodGhpcy5uYilmb3IodmFyIGEgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm5iW2FdKSk7dGhpcy5kYyYmKGI9dGhpcy5jbihiLHRoaXMuZGMpKTtyZXR1cm4gYn0scGw6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuamwodGhpcy55YS5jbGllbnRBUElzKX0samw6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE5hO2IucHVibGlzaGVyQVBJJiZhLmtvKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5qbyhiLnBsYXllcik7YS5mKCl9fSxnOmZ1bmN0aW9uKGIsYSxkLGcsYyxlKXttPXRoaXM7dGhpcy5iZj0hMDt0aGlzLk5jPWI7dGhpcy5xYT1hO3RoaXMud2Y9ZDt0aGlzLmJlPWc7dGhpcy5oYz1jO3RoaXMueWE9ZXx8e307dGhpcy5wbCgpO3RoaXMuVG0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5SbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuRmMoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5GYygpfWNhdGNoKGspe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9fSx4YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sVG06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuTmMrdGhpcy52ZSgiZ2xvYmFsIikpLHRoaXMubW0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5GYygpfS5iaW5kKHRoaXMpLCEwKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy52ZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5GYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5DZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sdmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlFiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMucmQpe3RoaXMucmQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGYpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaGM9CiExKTsiZm9jdXMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5oYz0hMSk7dGhpcy5oYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhjP3RoaXMuaGMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlhlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLmdlKSk7dGhpcy5ZYigpO2UuSmMoay54bik7KGE9ZS5VYSh0aGlzLkhkKCkpKXx8KGE9ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbW06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJgooZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5UYnx8dGhpcy5BYXx8dGhpcy5GYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpLHRoaXMuWWIoKSl9fSxGYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExOwp0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGY7KGY9dm9pZCAwPT09YSl8fChmPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5IZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihmKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5EKCJ3ZWIuZGUiKXx8ZS5EKCJnbXgubmV0Iil8fGUuRCgiZ214LmF0Iil8fGUuRCgiZ214LmNoIil8fGUuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlBjKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5laShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuamQ9ZC5hZF9mYWxsYmFja19jb25maWd8fAohMTt0aGlzLlRiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5UZT1kLmFkcGF0aHx8IiI7dGhpcy5BZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlRiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLlJjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKSx0aGlzLlliKCkpfSxlaTpmdW5jdGlvbihiKXt0aGlzLmtkfHwodGhpcy5rZD1ifHwiIil9LFJjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucGMoKSksZD10aGlzLmFhKHRoaXMuVGIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsCiIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuVGIrdGhpcy52ZSgiY3VzdG9tZXIiKSk7dGhpcy5LYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm1jPSEwO3RoaXMuUmMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fApkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuVmY9dGhpcy5nYihkLnN0cmljdCk7dGhpcy4kZD10aGlzLmdiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlJnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5hYj10aGlzLmdiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5nYihkLmVuYWJsZWQpO3RoaXMuVWI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5XYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmFkPWQudGVzdGFkdGFnc3hocnx8CltdO3RoaXMuc2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMub2I9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5kYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucGQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuY2Y9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuaGI7dGhpcy5KZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnNkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy4kZj1kLnZtYXBzfHwiIjt0aGlzLkRjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmVpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5qZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5YZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMua2I9CmQueWllbGRsYWJ8fG51bGw7IXRoaXMubWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1jPSEwLHRoaXMuUmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT28oKSYmKHRoaXMuVWJ8fHRoaXMuV2J8fHRoaXMuVmJ8fHRoaXMuYWQpP3RoaXMud2Y/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLkJiKSksdGhpcy5CZSgpLHRoaXMuWWIoKSk6dGhpcy5HbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlJmKCkpfX0sWG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSksYj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6Yixob21hZF91cmxfc3VmZml4X2Jhc2U2NDplLnBiKGIpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07ZS5RYyh0aGlzLnBjKCksIlBPU1QiLGIsZnVuY3Rpb24oYil7dHJ5e3ZhciBhPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXt9ZS50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghYXx8IWEubGVuZ3RoKSwhMCk7dHJ5e2EmJmEubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlciYmKHRoaXMub2IrPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihhWzBdLmlkKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgYT0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuWSgxMCksaD1lLlkoMTApLEI9ZS5ZKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwpiKEIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKStiKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnBiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUuQWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApOwpyZXR1cm59dGhpcy5zYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sUmY6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKTt0aGlzLlliKCl9LCRjOmZ1bmN0aW9uKGIsYSl7dGhpcy53Yz0hMDt0aGlzLmtiJiYhdGhpcy5IaT8odGhpcy5YbSgpLHRoaXMuSGk9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoYixhKX0uYmluZCh0aGlzKSw1MDApKTp0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIoYikpLHRoaXMuWWIoKSx0aGlzLkJlKCkpfSxGbzpmdW5jdGlvbigpe2lmKHRoaXMuVWIpe3ZhciBiPWUuQWQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkptKCkpdGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7CnRyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVWIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5VYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChnKXt9Yj90aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm5pKCl9fWVsc2UgdGhpcy5uaSgpfSxQZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuUWIoKSksdGhpcy5LbyhnLAowPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLk9mLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLk9mKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5WYj10aGlzLmFkKSYmdGhpcy5WYi5sZW5ndGgpe3ZhciBkPXRoaXMuVmIuc2xpY2UoKSxnPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5PZigpfSxLbzpmdW5jdGlvbihhLGYsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5RYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5QZi5iaW5kKHRoaXMpLGYuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5QZigpfX1mdW5jdGlvbiBmKCl7dGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLldiJiZ0aGlzLldiLmxlbmd0aCl7dmFyIGQ9dGhpcy5XYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlBmKCl9LExvOmZ1bmN0aW9uKGEsZixkKXtmdW5jdGlvbiBnKCl7ZSgpJiZmKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZil7Zj09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sT2Y6ZnVuY3Rpb24oKXtpZih0aGlzLnNjKXRyeXtlLlFjKHRoaXMuc2MsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRmI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5SZigpfS5iaW5kKHRoaXMpLHRoaXMubGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5saSgpfWVsc2UgdGhpcy5SZigpfSxsaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpO3RoaXMuWWIoKTt0aGlzLkJlKCl9LEptOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApZYjpmdW5jdGlvbigpe3ZhciBhPSIwIixmPSIwIjt0cnl7ZS5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLndjJiYoZj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitmLCEwKTsodGhpcy5DYSYmdGhpcy5pc0VuYWJsZWQmJmUuRCgiY2hpcC5kZSIpfHxlLkQoImZvY3VzLmRlIikpJiZ0aGlzLmNsKCk7dGhpcy5zYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkZiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5oZSkpO3RoaXMuYmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5iZSYmdGhpcy5iZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5GYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuV2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5XYy5pZD1lLlkoMTApO3RoaXMuV2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLldjKTt2YXIgYT0KdGhpcy5XYy5jb250ZW50V2luZG93LGY9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Quc3JjPSJodHRwczovL3Vwcy54cGxvc2lvbi5kZS9sb2FkZXIvOTE2MjgvZGVmYXVsdC5qcz94cGxyZGlyPTEiO2EuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKTtmLnNyYz1lLnllKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZS50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sCm9sOmZ1bmN0aW9uKCl7aWYodGhpcy4kZCYmdGhpcy5vbSgpKXt2YXIgYT10aGlzLllsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxzaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZixkLGcsYyxoKXt0aGlzLkdkfHwodGhpcy5HZD0wKTt0aGlzLkdkKys7dGhpcy5HZD50aGlzLnBoJiYhdGhpcy5xaCYmKHRoaXMucWg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLnBoLCEwKSk7YT1uZXcgTWEoYSxmLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpOwpnJiYoYS5HaT0hMCk7YyYmZS5IbSgpJiYoYS4kZz0hMCk7aCYmKGEua2k9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLmFufHwodGhpcy5hbj0hMCxlLkRhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhmPWEucmVzcG9uc2VYTUwpfHwoZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJgpnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlBjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1lLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGYpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLiRmfSxtbDpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hcC5iaW5kKHRoaXMpLHRoaXMuJG8uYmluZCh0aGlzKSl9LGFwOmZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsO3RyeXsoZj1hLnJlc3BvbnNlWE1MKXx8KGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5JbCgpfSwkbzpmdW5jdGlvbigpe30sSWw6ZnVuY3Rpb24oKXtlLkpjKGsuSGwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEJlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09Zi50eXBlJiZlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWYudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LE9vOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGR9LFFiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGY9IiIsZD0wO2Q8YTtkKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGZ9LGdiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PQphfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGY9IiIsZCxnLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZj1mKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspOwpyZXR1cm4gZn0sYWE6ZnVuY3Rpb24oYSl7dmFyIGY9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtmW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixmKXtiJiYoZC5xdWVyeUtleVtiXT1mKX0pO3JldHVybiBkfSxIZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBmKGEpe3ZhciBiPQoiIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsYis9Zi50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWVbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyllW2ddPWQoZVtnLTNdXmVbZy04XV5lW2ctMTRdXmVbZy0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnF8biZyfHEmcikrdStlW2ddKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihmKGgpK2YoaykrZihsKStmKG0pK2YodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnVqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLkJrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZixkKXt0aGlzLmE9CmE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5iaS5iaW5kKHRoaXMpLG11dGU6dGhpcy5sZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEucmI7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5pYz10aGlzLnFkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zjt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5VZD17fTtlLnViKCJuZXdCaWdBZElkIik7dGhpcy5hbD1lLlkoMTApO3RoaXMuTGY9MDt0aGlzLm5kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMubmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMubmQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYKInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVWM9dGhpcy5UZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy51ZT0hMTt0aGlzLnZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubmM9ITE7dGhpcy56bD1lLlkoMTApO3RoaXMuUGI9ZS5ZKDEwKTt0aGlzLk5iPWUuWSgxMCk7dGhpcy5naT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmNlPXRoaXMuWmI9dGhpcy5GZT10aGlzLnhkPXRoaXMuVmQ9dGhpcy5BYj10aGlzLnVjPXRoaXMuUGg9dGhpcy5FZT10aGlzLkNkPXRoaXMuUG89dGhpcy5EYj10aGlzLk9iPSExO3RoaXMuemM9W107dGhpcy5vYz17fTt0aGlzLnRuPTIwMDt0aGlzLmNnPXRoaXMuY2Q9dGhpcy5FYz10aGlzLmJnPXRoaXMudmY9ITE7CnRoaXMubmY9e319Yy5vaj1hO2EucHJvdG90eXBlPXskbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGY9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBmfSx0aTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5MYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMud28oKTtlLm8oay5Kayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmZjpmdW5jdGlvbihhLGYsZCxjKXt0aGlzLkRiPWQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQS5TKXRoaXMuTGYrKyxlLnViKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxjPW0uZ2V0Q29uZmlnKCksZS5HZSYmKHRoaXMuQS5hbyh7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksCmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy50aSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpmLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpmPyh0aGlzLnRpKCksbmV3IFModGhpcyxhLHRoaXMuR2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaGIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB3Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3Yy5mZihhLGYsZCl9LDUwKX19LHJmOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5jZT10aGlzLlpiPXRoaXMuRWU9dGhpcy5DZD0hMTt0aGlzLmI9YTt0aGlzLnFvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLnpjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5VZD10aGlzLmltKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBmPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGY9dGhpcy5iaChiLnBhcmVudCkpLGYucHVzaCh0aGlzLlNsKGIpKSk7CnJldHVybiBmfSxTbDpmdW5jdGlvbihhKXt2YXIgZj0iIixkPVtdO2lmKGEmJmEuTCYmYS5MLmdldEF0dHJpYnV0ZSl7Zj1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmYsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGY9W10sZD1bXSxjPVtdLGU9W10saD0iIjtpZihhLkwpe2Y9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPQowO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKWQucHVzaChhLnNiKGZba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGY9YS5lcnJvci5kZXRhaWwuY29kZSksYS56ZCYmYS56ZC5lcnJvciYmYS56ZC5lcnJvci5jb2RlJiYoZj1hLnpkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZWQuY29kZTpmPT1GLmxlLmNvZGU/ZS5vKGsudnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnUoKSk6KGUuZ2YoKSxmPT1GLmdnLmNvZGUmJmUubyhrLmduLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpO2UubyhrLkdsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54bygpO3RoaXMuV2EoImVtcHR5Iik7dGhpcy5BLkZiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRmIsITApO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLmJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaGcuY29kZTplLm8oay53cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5tZS5jb2RlOmUubyhrLnhwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTsKYnJlYWs7Y2FzZSB2LmllLmNvZGU6ZS5vKGsuaG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB2LmZlLmNvZGU6ZS5vKGsuWW8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB2LmRnLmNvZGU6ZS5vKGsuWm8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMuamMoYSk7dGhpcy5RYSgpfSxqYzpmdW5jdGlvbihhKXt2YXIgZj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZj1hLmVycm9yLmNvZGUsOTAxPGYmJihmPTkwMCkpO2ZvcihmPXsiW0VSUk9SQ09ERV0iOmZ9O2EuT2EubGVuZ3RoOyl0cnl7dmFyIGQ9YS5PYS5wb3AoKTt0aGlzLmVmKGQudXJsLGQudHlwZSxmKX1jYXRjaChjKXt9fSwKcW86ZnVuY3Rpb24oYSl7dGhpcy5GZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuR2YodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihmPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9ZjtmPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2QmJmQuZW52dmFycyYmKGM9ZC5lbnZ2YXJzKCkpO2MudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRWQmJihjPWQuRWQoKSk7Yy52aWRlb1Nsb3QmJihmPWMudmlkZW9TbG90LHRoaXMudmY9ITApfWNhdGNoKGgpe31mLnhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihmLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pOwppZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmYuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuU2smJnRoaXMucGxheWVyLk1lKCkmJihmLnZvbHVtZT10aGlzLnBsYXllci5NZSgpLzEwMCk7Zm9yKDtmLmZpcnN0Q2hpbGQ7KWYucmVtb3ZlQ2hpbGQoZi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZi5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZixhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnZmJiZmLmxvYWQoKTtpZih0aGlzLm9pKGYpKXt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGYpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMudmY/dGhpcy52aWRlbz1mOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChmKX1jYXRjaChsKXt0aGlzLnZpZGVvPWZ9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZiksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxvbzpmdW5jdGlvbigpe3RoaXMuYmc9ITA7CnRoaXMuQWI9dGhpcy51Yz0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5BYj0hMCk7ZS5DZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5vYSYmZS5Sayh0aGlzLmIub3JpZ2luLm9hKTt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlFoKCk7dGhpcy5hLklmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5JZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5HZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy56aSgidnBhaWQiKTsKaWYodGhpcy5BYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlNiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfXRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7CnRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5HZih0aGlzLkYsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkYub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMua2EmJnRoaXMuYS5jLmthKCkmJihhPSEwKTt2YXIgYj10aGlzLmIubG0oKSxjPXRoaXMuYi5zLk9yaWdpbmFsQWRQYXJhbWV0ZXJzO2lmKGImJmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgaD10aGlzLkEuZ2V0Q29uZmlnKCk7aCYmaC5hZEZhbGxiYWNrQ29uZmlnJiZoLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihjPUpTT04uc3RyaW5naWZ5KGguYWRGYWxsYmFja0NvbmZpZykpfXZhciBrPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLAphZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5sYSh0aGlzLkYsImNvbmZpZyIsayk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsCiJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnllKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7ZS53ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5HYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuemM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5qcChhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLmtwKCksdGhpcy5hLmxjKCEwKSwhdGhpcy5aYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5aYj17ZWw6dGhpcy5GLApjYjpmdW5jdGlvbigpe3RoaXMuY2U9ITA7ZS5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuWmUodGhpcy5aYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmxjKCEwKSx0aGlzLm9wKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5sYyghMCksdGhpcy5zcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ycCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnRwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnBwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkVpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5xYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkEuRGN8fHRoaXMuY2QpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5jZCYmKHRoaXMuY2c9ITEsdGhpcy5yYygpKSx0aGlzLm1wKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuQWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlNiKCJtdXRlZCIsInVzZXIiKSxlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5BYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuU2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuVGYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsuc2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7ZS53ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLndlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnhnKGZ1bmN0aW9uKGEpe2UubGEodGhpcy5GLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sbHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnVjPSEwfSxtcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmxkLHRoaXMuYi5zLAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudWM9ITF9LG9wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsudGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuc2csdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5paSgpO2UubyhrLm9nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2UubyhrLmxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuQ2Q9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmxnLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxycDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSx0cDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0scHA6ZnVuY3Rpb24oKXt0aGlzLlhmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sRWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGY9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZik7CmUuQ2UoKTt0aGlzLkY9ITE7dGhpcy5RYShhKX19LGpwOmZ1bmN0aW9uKGEpe3ZhciBmPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWYmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGY9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGYubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTtlLm8oay51cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuRWkoITApfSxOazpmdW5jdGlvbihhLGYpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUGMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChmLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuZ3AuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoZix0aGlzLkEpKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFFrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuWmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sUGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuQmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5aZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5pY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljfHx0aGlzLlpmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWWspKX0sWmY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWQmJnRoaXMub2kodGhpcy52aWRlbykmJiF0aGlzLk9iJiYhdGhpcy5pYyl7dGhpcy5xZD0hMDt0cnl7aWYoIWUuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuT2J8fCh0aGlzLk9iPSEwLHRoaXMuUGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5ZYSgpLCEwKSx0aGlzLkEuUmd8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChmKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLmVwKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuSWYoKTt0aGlzLmNwKCk7dGhpcy56aSgpO3RoaXMuQWcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuTWYoKX19LE1mOmZ1bmN0aW9uKCl7dGhpcy54ZHx8dGhpcy5tZygpfSxtZzpmdW5jdGlvbihhKXt2YXIgZj10aGlzLnZpZGVvLnBsYXkoKTtpZihmJiZmWyJjYXRjaCJdKWZbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnhkfHwoYT90aGlzLlFhKCk6KHRoaXMubGYoITApLHRoaXMubWcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMudWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk1mKCkpfS5iaW5kKHRoaXMpO3RoaXMuT2UoKS5maSh0aGlzKX0sWGY6ZnVuY3Rpb24oKXt0aGlzLkEuYWImJiF0aGlzLk9iJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWGEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5FZT0hMDtlLm8oay5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUWEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBmPVtdLGQ9ITEsYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZS5naChhW2NdKSxmLnB1c2goZCk7YT17aGFzaGVzOmZ9O2E9ay5TYShhLHRoaXMudSgpKTtlLnVvKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5lZSYmdGhpcy5Layh0aGlzLmIuZWUpOwppZighdGhpcy5GZSlpZih0aGlzLkZlPSEwLHRoaXMuY2V8fChlLm8oay5sbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5DYnx8dGhpcy5iLnhjKXtlLnViKCJuZXdTbWFsbEFkSWQiKTt0aGlzLkxmKys7dGhpcy5pYz10aGlzLnFkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGYpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnhpKCl9Y2F0Y2goaCl7fXRoaXMuVmQ9ITA7dGhpcy5hLlNlKCk7dGhpcy5uYz0hMTt0aGlzLk9lKCkuJGgoKTt0aGlzLmIuQ2ImJnRoaXMuYi5vcmlnaW4ubWYoKTt0aGlzLmIueGMmJihhP3RoaXMuYi5vcmlnaW4uSmgoKTp0aGlzLndkKCkpfWVsc2UgdGhpcy53ZCgpfSwKZ3A6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLllmKGEpKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5pYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTt0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxDaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5RYSgpO2Vsc2V7dGhpcy5uYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkdjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5UbyhhKTtpZighdGhpcy5aYil7dmFyIGY9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGY9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlpiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5jZT0hMDtlLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmYscGVyY2VudDpkLHN0YXJ0VGltZTohMX07ZS5aZSh0aGlzLlpiKX1kPSIiO3RoaXMuYi5LZiYmKGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5naSkpJiYoZD10aGlzLmIuS2YtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIiwKZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlRkfHwodGhpcy5UZD0hMCxmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5zZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5DYj8odGhpcy5pYz10aGlzLnFkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmliLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEueGkoKSx0aGlzLmIub3JpZ2luLm1mKCkpOnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxmLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMubmQucmVwbGFjZSgiW3RpbWVdIixlLmFoKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudWU9ITA7CnRoaXMudmlkZW8uY29udHJvbHM9ITF9fSx1aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuQ2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxUbzpmdW5jdGlvbihhKXtlLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudml8fHRoaXMuT2J8fCgwPT1hJiYodGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMuQS5GYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuRmIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy51aSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMudWkoKX0uYmluZCh0aGlzKSksdGhpcy5PYnx8CnRoaXMuaWkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5hYiYmdGhpcy5YYSgic3RhcnQiKSxlLm8oay5vZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGUubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMuQ2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLm8oay5sZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLAplLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy52aT1hKX0saGk6ZnVuY3Rpb24oYSxmKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsZiwhMCl9LHdvOmZ1bmN0aW9uKCl7ZS5iZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxpaTpmdW5jdGlvbigpe2UuYmQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtlLmJkKFsic3RhdHNfaGRfYWRfZW1wdHk6IisKdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2UuYmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuYmd8fHRoaXMuQS5hYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxTYjpmdW5jdGlvbihhLGYpe3RoaXMuQS5hYiYmZS50cmFjaygic3RhdHNfaGRfIithLGYsITApfSx0cmFjazpmdW5jdGlvbihhLGYpe2lmKCF0aGlzLk9iKXt0aGlzLm5mJiZ0aGlzLm5mLnRyYWNrJiZ0aGlzLm5mLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZS5HZSYmZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09CiEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5FYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlVkLmltcHJlc3Npb25zJiZlLkZtKGgudXJsLHRoaXMuVWQuaW1wcmVzc2lvbnMpP3RoaXMuZWYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UubyhrLklrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5lZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZil0cnl7dGhpcy5iLk9hPXRoaXMuQ2wodGhpcy5iLk9hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsCmY9IiI7dGhpcy5iZyYmKGY9Il92cGFpZCIpO3RoaXMuY2QmJihmPSJfd2VsZWN0Iik7cmV0dXJuIGErZn0sZWY6ZnVuY3Rpb24oYSxmLGQsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZj10aGlzLkEud2EoYSksZCYmZi5NayhkKSxjfHwoYz10aGlzLlFnKSxlfHwoZT10aGlzLlFnKSx0aGlzLk9rKGEpLHRoaXMuQS5LYShmLGZ1bmN0aW9uKCl7dGhpcy5aaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlpoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxPazpmdW5jdGlvbihhKXt0aGlzLm9jW2FdPSJvcGVuIn0sWmg6ZnVuY3Rpb24oYSl7dGhpcy5vY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLm9jPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZjtmb3IoZiBpbiB0aGlzLm9jKXRoaXMub2MuaGFzT3duUHJvcGVydHkoZikmJiJvcGVuIj09dGhpcy5vY1tmXSYmYSsrO3JldHVybiBhfSxqbTpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0KZn0pfSxDbDpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Zn0pfSxlcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2Eud2cmJmEud2codGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGUuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMucmMoKTtlbHNlIGlmKHRoaXMuYi5xYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5EZXx8KHRoaXMuYi5EZT0xKTtpZigxMDA+YS10aGlzLmIuRGUpcmV0dXJuO3RoaXMuYi5EZT1hfWNhdGNoKGYpe31lLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQoiX3RvcCI7aWYodGhpcy5BLkRjfHx0aGlzLmNkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnFifWNhdGNoKGYpe2E9d2luZG93Lm9wZW4odGhpcy5iLnFiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX19fS5iaW5kKHRoaXMpLDUwMCl9fSxjcDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5uZC5yZXBsYWNlKCJbdGltZV0iLGUuYWgoMCkpO3ZhciBmPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5zZCYmKGY9dGhpcy5BLnNkKTtmJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhiLmJpbmQodGhpcyksMUUzKmYpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5zZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sClJkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEuc2QpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZS5OZih0aGlzLmNvbnRyb2xzKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuUGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucmkuYmluZCh0aGlzKSksZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5yaS5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnBpLmJpbmQodGhpcykpLGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLk5iO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmdpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLktmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLndpZHRoPSIxMDAlIixmLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixmLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixmLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixmLnN0eWxlLmJvdHRvbT0iMHB4IixmLnN0eWxlLnpJbmRleD0iMTAwMDAiLGYuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGYpO3RoaXMuYS54ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5sZigpKTt0aGlzLkliKCl9fSxJYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHJjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmNnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpKX0scmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnVjPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudWM9ITEpOihlLmxhKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy51Yz0hMCl9LExkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuU2IoIm11dGVkIiwidXNlciIpLGUubyhrLkpkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpOwp0aGlzLkFiPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5TYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxxYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYyk7dGhpcy54ZHx8dGhpcy51ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTWYoKSl9LHdkOmZ1bmN0aW9uKCl7dGhpcy5PbSgpJiZ0aGlzLk5tKCkmJih0aGlzLkEud2N8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuTGImJnRoaXMuVW8oKXx8KHRoaXMueGQ9ITAsdGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy5MZygpKX0sT206ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCk7aWYoIXRoaXMuQS5oYnx8ZS5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGY9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuRGEoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZitkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuVWN8fChhPQohMCxmLmFkRmFsbGJhY2tVUkx8fChmLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkVjJiZmLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5VY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRWM/ImFueSI6IiIpKyhmLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5VYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRWMmJmYuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlVjfSxabDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxmPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1mLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmYuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1lLnllKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5mZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy53ZCgpfXZhciBmPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWmwoKTt0aGlzLkVjPXRoaXMuVWM9dGhpcy5jZD10aGlzLmNnPSEwO3JldHVybiBmPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2YsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy50bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlNlKCksdGhpcy5hLlluKCksdGhpcy5uYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkVlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5PZSgpLiRoKCkpfSxPZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxBZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLlllKHRoaXMudmlkZW8sYSk/dGhpcy5iaSgpOnRoaXMuTGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5xYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5DYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy56YyYmMDx0aGlzLnpjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy56YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5hbCsiLSIrdGhpcy5MZjt0aGlzLmImJnRoaXMuYi5oaCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuaGgoKSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5sa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtmPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlg9W107dGhpcy5MPW51bGw7dGhpcy55Yz10aGlzLkFjPSExO3RoaXMub2E9IiI7dGhpcy5hZz0hMTt0aGlzLnNoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGYsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZj1mdW5jdGlvbigpe3JldHVybiBjKCkmJihlLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRCgiZmFuZG9tLmNvbSIpfHxlLkQoImdpZ2EuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGMoKXx8ZigpKXt2YXIgaD1lLk5nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGY9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuRCgiZ2lnYS5kZSIpfHxlLkQoImtpbm8uZGUiKXx8ZS5EKCJzcGllbGV0aXBwcy5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZigpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1kKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLldkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5LYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxkaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkxiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChmKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5MYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuTGJ8fHRoaXMuTG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0uRW8oKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sTG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2M9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksYz1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkduKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLnNoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWC5sZW5ndGgpdGhpcy5UYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuZWQse2Vycm9yOnRoaXMuYWc/Ri5sZTpGLmZnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGQpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLlgubGVuZ3RoP3RoaXMuVGMoKTp0aGlzLnJhKHRoaXMuUmEodi5lZCx7ZXJyb3I6dGhpcy5hZz9GLmxlOkYuZmd9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuZWcse2RlcHRoOmJ9KSl9LFRjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWC5zaGlmdCgpO3RoaXMuUG0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubWgoKSxmLHtBZFN5c3RlbTp0aGlzLlJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmhnKSk6KGI9MCx0aGlzLldvKCkmJnRoaXMucmYodGhpcy5CbCgpKSl9LG1mOmZ1bmN0aW9uKCl7dGhpcy5BYz8odGhpcy5BYz0xPHRoaXMuWC5sZW5ndGgsCnRoaXMuWC5sZW5ndGgmJnRoaXMuVGMoKSk6dGhpcy5wYXJlbnQubWYoKX0sSmg6ZnVuY3Rpb24oKXt0aGlzLnljPyh0aGlzLnljPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLlRjKCkpOnRoaXMucGFyZW50LkpoKCl9LFdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLktjKCk/dGhpcy5yYSh0aGlzLlJhKHYuZmUpKTp0aGlzLnJhKHRoaXMuUmEodi5kZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuZWQsRi5nZykpLCExKX0scmY6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuZWV8fChhLmVlPVtdKTthLmVlLnB1c2godGhpcy5zaCk7YS5PYT1hLk9hLmNvbmNhdCh0aGlzLmhmKCkpO2EuQ2I9YS5DYj9hLkNiOnRoaXMuQWM7YS54Yz1hLnhjP2EueGM6dGhpcy55YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWmc7dGhpcy5wYXJlbnQucmYoYSl9LApCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLktjKCk7YS5PPXRoaXMuamgoKTthLnFiPXRoaXMuVWwoKTthLkVxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUWwoKTthLktmPXRoaXMuaG0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpkLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGMpe319dGhpcy5MJiYoYS5PYT1hLmVycm9yLmNvZGUhPXYuZmUuY29kZT9hLk9hLmNvbmNhdCh0aGlzLlZsKCkpOmEuT2EuY29uY2F0KHRoaXMuZG0oKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5qYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmpjJiZ0aGlzLnBhcmVudC5qYyhhKSxiPTAsdGhpcy5UYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGpjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmpjKGEpfSxUZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxNbzpmdW5jdGlvbigpe3JldHVybiBiPApmfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuamgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5LYygpfSxRZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LG1pOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5RZigpJiYoYT0hMCk7cmV0dXJuIGF9LEduOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5hZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxQbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLm1oKCkubGVuZ3RofSxtaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5lKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFJsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmUodGhpcy5MLCJBZFN5c3RlbSIpfSxoZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1jJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fAphLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnpoKGEpKXt2YXIgZj1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Yy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpmLHVybDp0aGlzLnNiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxWbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmpoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFpwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnNiKGFbZF0pfSk7dmFyIGM9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGI9Zi5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxRbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixkPSExLGM9W10sYj0hMSxmPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Y9Yj10aGlzLkZkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWMucHVzaChkKTtlLnB1c2goZil9MTxhLmxlbmd0aD8oYj1jLGg9Zik6KGI9ZCxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxLYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnNiKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGhtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsYz0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGM9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUudG8oYyxhKSwwPmImJihiPSExKX1jYXRjaChmKXtiPSExfXJldHVybiBifSxOZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuc2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxzYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkZkKGEpOiIifSxGZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5RZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5QaXx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk89W107dGhpcy5xYj0iIjt0aGlzLnM9dGhpcy54Yz10aGlzLkNiPSExO3RoaXMuVWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlZlPSIifWMuVmo9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5PLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sYm06ZnVuY3Rpb24oKXtpZighdGhpcy5VZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm5hKXt2YXIgYT10aGlzLm9yaWdpbi5uYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5VZT1hW2RdKX1yZXR1cm4gdGhpcy5VZX0saGg6ZnVuY3Rpb24oKXtpZih0aGlzLlZlKXJldHVybiB0aGlzLlZlO3ZhciBhPSIiOyhhPXRoaXMuYm0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlZlPWF9LGxtOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2NdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Wanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5PaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXttZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixOYToiWE1MX1BBUlNFX0VSUk9SIn0sZGc6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGVkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGhnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApOYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTmE6IkxPQURfRVJST1IifSxpZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKenA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTmE6Ik1FRElBRklMRV9FUlJPUiJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE5hOiJEVU1NWV9BRCJ9fSxGPXtmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE5hOiJOT19BRFMifSxnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTmE6Ik5PX01FRElBRklMRVMifSxBcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGxlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Laj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBXYT1jLktqfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnpkPWM7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmRqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLk5sfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuYWk9YTt0aGlzLnZpZGVvPWM7dGhpcy5hZT1bXTt0aGlzLlloPVtdO3RoaXMub2Y9W107dGhpcy5mcD0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLkJwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYWkubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5haVthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLnRxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Wbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Nbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuYWUucHVzaCh7c3JjOmQsZnJhbWU6aCx2bjplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5vZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLm9mW2NdO2QudHlwZT09PWEmJmQuZmwodGhpcy5XbChhKSl9fSwKV2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7Q3E6ITAsQnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7cXE6InZpZGVvIixGcToianNDdXN0b20iLEdxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsSHE6MSwkcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LAprbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuYWUubGVuZ3RoO2MrKylpZih0aGlzLmFlW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYWVbY10udm47cmV0dXJuIiJ9LFZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5ZaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5rbShjKSx2ZW5kb3I6Y30pO3RoaXMudm8oKX0sTW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLmZwLm1hcChmdW5jdGlvbihhKXt0aGlzLnlnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMueWcoYSxjKX0seWc6ZnVuY3Rpb24oYSxjKXt0aGlzLm9mLnB1c2goe3R5cGU6YSxmbDpjLHpxOiExfSl9LHZvOmZ1bmN0aW9uKCl7dGhpcy5ZaC5tYXAoZnVuY3Rpb24oYSl7YS5JbXx8KGEuc3Eoe2FkU2Vzc2lvbklkOmUuWSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuRHEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5JbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLlhrfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLnJiPWEuZWgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWSgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy56Zz0hMTsKdGhpcy5lYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxDbzpmdW5jdGlvbigpe3RoaXMuemc9ITB9LHhpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkdjLHRoaXMuYy5sKCkpfSxZbjpmdW5jdGlvbigpe3RoaXMuemd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay52ZCx0aGlzLmMubCgpKSl9LElmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnJiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5yYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLnJiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMucmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5yYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5yYik7CnRoaXMuYy5YYyYmdGhpcy5jLlhjKCk/dGhpcy5jLmVoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sc206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGxjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5yYik7aWYoYy54IT10aGlzLkhhLnh8fGMueSE9dGhpcy5IYS55fHxjLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLkhhLndpZHRofHxjLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuU2UoKTtyZXR1cm59dGhpcy5IYT1jO3RoaXMuYy5YYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmVjLmxlbmd0aDthKyspdGhpcy5lY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLk5mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGMuYmluZCh0aGlzKSwxMCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLmVjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5lYy5wdXNoKGEpfSxTZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ybj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMucm58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5PZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sT2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGJiPWMuUGp8fGJiOyhmdW5jdGlvbihjKXtjLk9qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuYmM9dGhpcy5iY3x8ITE7dGhpcy5wZz10aGlzLnJnPQp0aGlzLndoPXRoaXMudmE9dGhpcy5TZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5TZj0hMDt0aGlzLndoJiZ0aGlzLkdnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuS2I7YSYmYS5uYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpOwp0aGlzLkNnKCl9LEdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmMpe3RoaXMudGQoKTtpZighdGhpcy5TZiYmIXRoaXMudGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlNmJiZ0aGlzLnBnJiYhdGhpcy5yZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19LHRkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxraDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxDZzpmdW5jdGlvbigpe2lmKHRoaXMudGQoKSl7dmFyIGE9CnRoaXMua2goImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5yZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnBnPWEuWHB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2coKX0uYmluZCh0aGlzKSwxMDApfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5vcSgpOiExfSxLYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuS2MoKTotMX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sS2w6ZnVuY3Rpb24oYSxiKXt0aGlzLmJjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLmJjfHwzMDI9PXRoaXMuYmM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuYmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuV2UoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5lbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBjYj1jLk9qfHxjYjsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEttOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlpqLkZrLkRrP3dpbmRvdy5PTy5aai5Gay5Eay5WcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5QZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGNiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlFqfHxkYixlYj1uZXcgZGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5FbHx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5uaCgpfSxuaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE1hOmZ1bmN0aW9uKCl7dGhpcy5UaCgpfSxUaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVml8fGdiOyhmdW5jdGlvbihjKXtjLlVpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRGcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlVpfHxoYjsoZnVuY3Rpb24oYyl7Yy5XaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFdoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLldoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5XaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLldpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLldrfHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5paz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxYYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuaWt8fFU7KGZ1bmN0aW9uKGMpe2MuaGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5tZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp3Lm1kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubm4oYSl9LmJpbmQodGhpcykpO3cubWQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5tZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0sbm46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5pYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLktkJiYoYT1lLkRsKGEsdGhpcy5LZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk0oZCkpe3RoaXMuTihkKTsKdmFyIGc9bmV3IFYoZCx0aGlzLkcpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLktkfHwodGhpcy5LZD1bXSksdGhpcy5LZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGc9bmV3IFYoZCx0aGlzLkcpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbWQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0sTm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5TY3x8Cih0aGlzLlNjPVtdKSx0aGlzLlNjLnB1c2goYSksdGhpcy5YbigpJiYodGhpcy55ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuU2MpZm9yKHZhciBhPTA7YTx0aGlzLlNjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuU2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5ObyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Tbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMuU298fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5SaXx8bWI7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuU2l8fApuYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuTShoKXx8KHRoaXMuTihoKSwobmV3IG5iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlRpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5ra3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLkljPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9CiEwKTt2YXIgYj10aGlzLlZnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5JYz1iKTtpZighdGhpcy5JZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRWQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVihiKTt0aGlzLkxuKHRoaXMuZ2V0UmF3UGxheWVyKCksCmEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHdnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTt0aGlzLmdjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5nYyYmdGhpcy5nYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdHJ5e3RoaXMuZ2NbYV0oKX1jYXRjaChiKXt9fSxFZDpmdW5jdGlvbigpe2lmKHRoaXMuSWMpcmV0dXJuIHRoaXMuSWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVmcoYSkpcmV0dXJuIHRoaXMuSWM9YX19LFZnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxMbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCwKZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS51bm11dGUmJgp0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0seGg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Nanx8cmI7KGZ1bmN0aW9uKGMpe2MuTGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5FZCgpP3RoaXMuQygpOih0aGlzLkhlfHwodGhpcy5IZT0xKSx0aGlzLkhlKyssMTAwPHRoaXMuSGU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Manx8c2I7KGZ1bmN0aW9uKGMpe2MuTmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyBzYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Oanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy5ranx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sCk1hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudmt8fHZiOyhmdW5jdGlvbihjKXtjLnVrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxKbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPQpbXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5CYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkpuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuTWMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7CnJldHVybn1pZighdGhpcy5CYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudWt8fHdiOyhmdW5jdGlvbihjKXtjLndrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTsKdGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgd2IoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMud2t8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLndtfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5zZj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTAwKX0sQW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5XJiZ0aGlzLlcoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx5bzpmdW5jdGlvbigpe3RoaXMuc2Y9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudGM9MH0sZjpmdW5jdGlvbigpe3RoaXMuJG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnRjfHwodGhpcy50Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy50Y3x8dGhpcy50YysrLHRoaXMudGM8PXRoaXMuJG0/KHRoaXMudGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnlvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQmI9Yy5ja3x8QmI7KGZ1bmN0aW9uKGMpe2MuZWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkcpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy55cHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5HYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUW0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm5nKCl8fHRoaXMuaSghMCl9LFFtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HYigpOyFhLnBhJiZhLlgmJmEuVXAmJmEuV3AmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2IoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZmQuR2IoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXS5pZD09YiYmKHRoaXMuTmg9YVtmXSk7cmV0dXJuIHRoaXMuTmh9LHBxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5HYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5mZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmZkLkdiKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmZkLkdiPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5mZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5wbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMucG58fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVihiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxucTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApYYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Ianx8WDsoZnVuY3Rpb24oYyl7Yy5Haj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnRmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMudGYmJmMhPXRoaXMudGZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuRCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEudXEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkdqfHxZOyhmdW5jdGlvbihjKXtjLklqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy55ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLklqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLk5pfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlYoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sZGk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGtuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0sQWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5BZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE9iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMudW58fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLllpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVihiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxkaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxrbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLllpfHxTYjsoZnVuY3Rpb24oYyl7Yy5aaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkFlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWml8fFRiOyhmdW5jdGlvbihjKXtjLiRpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgU2IoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBUYihjLHRoaXMuRykpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuJGl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLnFufHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlYoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxLbjpmdW5jdGlvbigpe3RoaXMuZGQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5kZHx8KHRoaXMuZGQ9ITAsdGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZGQmJih0aGlzLlpkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZGQ9ITEpLHRoaXMuWmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLnprfHxYYjsoZnVuY3Rpb24oYyl7Yy55az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmZjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5mYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGguYmluZCh0aGlzKSwxMCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuR2s9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkdrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxrZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5mYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2cuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5YaCgpO3RoaXMua2coKTt0aGlzLk5uKCl9LE5uOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuSG4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuSG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5mYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy55a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5LbigpLGE9bmV3IFliKGEsCnRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkFrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuVGt8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm5rPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZW49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGRpOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZZChhKX0uYmluZCh0aGlzKSl9LFlkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBOPWMubmt8fE47KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5MZSlpZih0aGlzLk1ifHwodGhpcy5NYj0wKSx0aGlzLk1iKyssMTU8dGhpcy5NYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5tbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLndiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5ta3x8TzsoZnVuY3Rpb24oYyl7Yy5vaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnlmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5va3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMueW58fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkNqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5WKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuQ2p8fFo7KGZ1bmN0aW9uKGMpe2MuQmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5PYz10aGlzLkJhPXRoaXMub2Q9ITE7dGhpcy5WaD1lLlFiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2IoKT8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkJqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Eaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkRqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy52bXx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVihiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5panx8aGM7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5oanx8aWM7KGZ1bmN0aW9uKGMpe2Muamo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmdhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmpqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Wa3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuemUoKTt0aGlzLkJnKCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemUuYmluZCh0aGlzKSwxMDApfSx6ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnplLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlVrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuTWQ9W107dGhpcy54Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5mbShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmNpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy54Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMueGZbZF07dGhpcy5XZihjKSYmKHRoaXMuTWQucHVzaChjKSx0aGlzLmNpKGMpKX19LFdmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0sZm06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMueGZbZF0sdGhpcy5XZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxjaTpmdW5jdGlvbihhKXt0aGlzLldmKGEpJiZhLmYoKX0sQW86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuTWQubGVuZ3RoO2ErKyl0aGlzLk1kW2FdLlhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTWRbYV0uWGIpfX19KShjKTt2YXIgcmM9CmMuWGp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuSmp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZS5KYyhrLlhvKSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5KYyhrLmpuKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHhjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksdmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbD0hMTtILmZhKCk7SC55aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnloKCksCmZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmEoKTt2YXIgeWM9eGMoZnVuY3Rpb24oKXtlLllnKHdpbmRvdyxILkFtKCkse2lkOnljfSl9LDUwMCksaWE9ZS5ZKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Daz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuQ2t8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5TaD10aGlzLmNvbmY9dGhpcy5KYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSWQ9MDt0aGlzLmViPSIiO3RoaXMuTmQ9W107dGhpcy5PZD0wO3RoaXMuVWg9ITE7dGhpcy51Zj1bXTtlLnViKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtpbzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPQphO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGNvOmZ1bmN0aW9uKGEpe3RoaXMuSmI9YX0sYm86ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gY30sWWM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuQm0oKSl0aGlzLkpiLmcodGhpcy5KYi5OYyx0aGlzLkpiLnFhLHRoaXMuSmIud2YsZnVuY3Rpb24oKXt0aGlzLlljKGEsYyl9LmJpbmQodGhpcyksdGhpcy5KYi5oYyk7ZWxzZSBpZih0aGlzLnBtKCkpdGhpcy5abihmdW5jdGlvbigpe3RoaXMuWWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkdjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLGw9Cm5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuQ28oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS51YigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBRYShsLHRoaXMuSmIsaCk7bC4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWm0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5kZiYmKGQ9dGhpcy5wbGF5ZXIuZGYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZmYoYSxkLGcpO3RoaXMucGxheWVyLmZpKGwpfX0sQm06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5JZClyZXR1cm4gYz1hLmdldFRpbWUoKS0KdGhpcy5JZC5nZXRUaW1lKCksdGhpcy5JZD1hLDNFNTxjPyEwOiExO3RoaXMuSWQ9YTtyZXR1cm4hMX0sc286ZnVuY3Rpb24oKXtlLnViKCJwcmVyb2xsIik7ZS5EZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlVnKGEpKT90aGlzLlljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlNoKXtlLkRmKCJwb3N0cm9sbCIpO2UudWIoInBvc3Ryb2xsIik7dGhpcy5pbyghMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7CihkPXRoaXMuVWcoZCkpP3RoaXMuWWMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9fSxVZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sUm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbyh0aGlzLnJvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk1hKCl9LFNkOmZ1bmN0aW9uKGEpe2UudWIoIm1pZHJvbGwiKTtlLkRmKCJtaWRyb2xsIik7aWYoIXRoaXMuSGgpe3RoaXMuSGg9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuWWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGg9CiExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnZkLHRoaXMucGxheWVyLmwoKSkpfX0sUW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmpmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLnNvKCk7dGhpcy5wbGF5ZXIuamYmJnRoaXMuUW4oKTt0aGlzLlJuKCl9LFNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGYpe3RoaXMuTmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmtiKGEsYixjLGYsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsCmFbY10ubWFjcm8pfXRoaXMuT2Q9dGhpcy5OZC5sZW5ndGh9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLk9kJiYoYT0hMCk7cmV0dXJuIGF9LFpuOmZ1bmN0aW9uKGEpe3RoaXMuVWg9YTtmb3IoYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fbi5iaW5kKHRoaXMpKX0sRW46ZnVuY3Rpb24oYSl7dGhpcy5PZC0tO2EmJnRoaXMudWYucHVzaChhKTswPj10aGlzLk9kJiZ0aGlzLlVoKCl9LFptOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLnVmLmxlbmd0aDtkKyspYz10aGlzLnVmW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLkxpfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucGt8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoeG9vU2VpaG9BY2hhYWNoaSx4b29TZWlob0FjaGFhY2hpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.90.4
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.4.90.243.136.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 34C3
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame ADFF
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
pubads_impl_2020021101.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame CB02
|
167 KB
61 KB
|
63ms
63ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame CB02
|
113 B
782 B
|
37ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81c::2002
GOOGLE
|
|
|
GET
H2
|
200
|
pubads_impl_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame A4A5
|
167 KB
61 KB
|
86ms
81ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame A4A5
|
113 B
175 B
|
33ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81c::2002
GOOGLE
|
|
|
GET
H2
|
200
|
pubads_impl_2020021101.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame F33B
|
167 KB
61 KB
|
74ms
73ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame F33B
|
113 B
175 B
|
29ms
16ms
|
Script
application/javascript |
2a00:1450:4001:81c::2002
GOOGLE
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
29ms
29ms
|
Script
text/javascript |
52.51.174.200
AMAZON-02
|
|
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_14_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F74.0.3729.169%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=-1&screen=1200x1600&mbr=72c5521d51f4e1601a65d8033e3ced40&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=562141603420
- Requested by
- Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.51.174.200
Dublin, Ireland,
ASN16509
(AMAZON-02, US),
- Reverse DNS
- ec2-52-51-174-200.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 71116c6b784888bed6c84c53b651765777b12976c32c9366e6a17bf7641da172
|
GET
H2
|
200
|
pubads_impl_2020021101.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 444A
|
167 KB
61 KB
|
104ms
104ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame 444A
|
113 B
175 B
|
24ms
19ms
|
Script
application/javascript |
2a00:1450:4001:81c::2002
GOOGLE
|
|
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
849 B
|
111ms
28ms
|
Script
application/javascript |
54.229.119.201
AMAZON-02
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame 9773
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSa3BDfkBsR-WDw3BsUkWsfABifABSfABSfABi7ABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4218434000800717399
|
42 B
662 B
|
29ms
27ms
|
Image
image/gif |
52.51.174.200
AMAZON-02
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.1.damoh.golem.de/999020b4e70c88da3355eb73c5ad34545836033f/
|
110 B
670 B
|
35ms
35ms
|
XHR
application/json |
136.243.90.4
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.golem.de/999020b4e70c88da3355eb73c5ad34545836033f/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIHhvb1NlaWhvQWNoYWFjaGk9eG9vU2VpaG9BY2hhYWNoaXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3cucGZ8fCh3LnBmPTApO3cucGYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXcudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9dy52aWRlb3BrZ0ludGVyZmFjZSk7MTA+dy5wZiYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBlPTA7ZTxELmxlbmd0aDtlKyspRFtlXS5sb2FkKCk7CmZvcihlPTA7ZTxELmxlbmd0aDtlKyspe3ZhciBhPURbZV0ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1KJiYoSigpLEo9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGU9d2luZG93Lk9PO2V8fChlPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGV9ZnVuY3Rpb24gZWEoKXtpZighbCl2YyhlYSw1MCk7ZWxzZSBpZighZS53bil7bC5wYXVzZUJ1dHRvbnx8KGwucGF1c2VCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGF1c2UxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwpsLnBsYXlCdXR0b258fChsLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvcGxheTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLm11dGVCdXR0b258fChsLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL211dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnVubXV0ZUJ1dHRvbnx8KGwudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7bWF4LWhlaWdodDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy91bm11dGUxODEwMDIucG5nXCciIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRFJrSXdOelJDTWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBEUmtJd056UkNNelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QaS9kcUd3QUFBU0ZTVVJCVkhqYTdKbExUQk5CR01lM2lFaWw3MjVMYTB1UWk2MlBBeG9ESFBIQ3paWkVxaWFRUUEySndzRlh2R2hNQ0hmZkppWUcxQ1llUkVFMHhJUHRCWTdZRXlhQytFS0lFQk1yN1c0VmlvaldiM2V0V2JxejIwNVoxRTMyTzJ3bU96UGYvUGFiL3p4WDA5N2VUaWpOaWhPSmhQS2dLWXBTSG5RcWxWSWVkRHFkVnFIL2hoVVJDalJWSGlxME9oRFZTS3ZRcXFiL2ZhVFB6TTN0bytrdHk4dGZObXc0NVBGOExDbmg1M1ozZDNkMWRlVjBzaTJWYW83RndJLyt4NDlYV3UxaGp3Y3YwbWtjcTZjb2FBeUlvU2EwZDNscVNyZXl3bVhwZExxK3ZqNmZ6NWZUeWJiRnhkNDNiM3p4T0hnQVA1NVVhdi84UEJZR0pqUk44Ny9ZczdUVTgvWXRjQU54VDArUGh3MVlUbUtvb3YvNWsrOW5menlPaFlFbkR5NDJmUE11TGZXK2UwY01EM3U5WHU2TmhFTUlhdS9VbEdFMU1iSVc5Qmc4aDRhR1pKREhEWnN0V1ZRazVQWWVPMFprVGtBU01iNGxRbnpYYXVYSytGaURCSFNhMys4WGxRZldDSUJCYzZTcVNzaE5QSDlPMU5jVDRpYzNpUEh0OSsrUnhPZGRMbGRuWjB0TEM2VDNzc1lFSXROdk1rUWFiTEswTkxoMXF3UTNNc1ppeEkvOS9zY21FOGNLSlYycy9aRUt0cWFoZHhvYkc4Vys5VXNzWm1odUpsYVBTNDRieGlYTWh2ekJlbWQ2R2ttY3ZIWnRTMjF0T2hqVTYvVi9FTE1TZVBNMGZIRk5UWTJVVmtaR21OQUt1TzlzMnRSV1djbHhnOXhETXpOSTRuTk9aMk50TFo5TUlvRWhqeHdDcjY1bXVJM0dyTmZidjMwRFVJZzM2RmlNT05yUjhTaFRVUnBhaG9HWVAzZDA4K1pIaVFSYUZWZXZFbTF0YTlwN0ZCam1YTnlNdnJPVXc5cFpoMk95cmk1UFZSU3lJcTZWVzJEUE9qb0dEWWIwbW0zTmtjNmJtMUZGYTJ1ZUFWNVBUV2R4WDdraWxubmRZbm5KemhYeTdLZGxrQWRuWTJQRXlaTmltYTBVNVlyRjhnOXdnWnJHSmhiTzJUeURhY1FOQy9YWW1DelFvb3NMQm5jdTR0OUcwOXM3TzcxT3AzRFprMGlzejVRWENoRzdkK2NtenNUN3lkemNqbWowbjBZYWlJTkI5S21NSk9GNTRmTm5CUHFKRThUUm8xZzZ5ZDU3aVBITXpzNk9qbzZLeHN4Z1lBSW1UdnhRcCtQU1NPNjZtemNQa0NRMDRYYTc1VHpZRHJBbVZxM3A2OWNMOC9Ob1lxdDFvS3lNWU4xeUNXUkorSmpJNE9CdG5RNEFnTjdBTGpyNVJycUFldytHT0I1SFpNRGlFZ3IxUSsvemZQYVhsZEVhRFhBYkJRMDEzTHNYdGxqZ1NCd09oemxFbWgwYmhXOU5SWWtYRmk2S0VjT2lXRjJkUG40OEt5ZXMxWDZ3Mis5LytpVGtCbGZ3YW9DRlpyNnd2NTlqblppWUFPV0lzV213VkJWWVdMaUUvSVdYSVlaa1JVVUZzdTZPNWVVSHNaZ1J4WEhhYklZT1dkVUpEUTN3akVRaU10d3dCUllYRWZPdlJuTjZ6eDY2cWtxNjdrUkp5VUdiRFFybjR6YkNtanhuUkdHVDhDWkFrZzlldnc0RUFueEZJbTE4NDBZb2pIU3lqcGMxVDB0THN4cHJJa2xBWVlER3g2RlA0U250QVFvM0NiakJMUmFHeHVsMFlpbmtNa1VkWXYrWHZpZ3VQbVV5QVVUVy9KMU1Kbk02MmZuOU8valp0YklDNmZ0YUxmakJZdEE0SEE3RjNab3FFN3E4dkZ4NTBIYTdYWG5RTnB0TmVkQWt1NGRVb2RjZjJtcTFLZy9hWXJFb0Q5cHNOaXNQMm9TNWhLclFoVUliODdnNC9PK2dZVittUEdqdWY0ZXk3SmNBQXdEYW5PTElPL3Bna0FBQUFBQkpSVTVFcmtKZ2dnPT0iLz4nKTsKbC5za2lwYWJsZUJ1dHRvbnx8KGwuc2tpcGFibGVCdXR0b249JzxkaXYgc3R5bGU9Im9wYWNpdHk6IDAuNzttaW4taGVpZ2h0OiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1yaWdodDogNnB4O2JvcmRlcjogI0ZGRkZGRjtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZCBpbiBbdGltZV1zPGRpdj4nKTtsLnNraXBCdXR0b258fChsLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1jb2xvcjpibGFjaztiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteDsiPlNraXAgQWQ8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDMwcHg7ZGlzcGxheTogaW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IiBvbmVycm9yPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9za2lwMTgxMDAyLnBuZ1wnIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYobC5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtsLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3ZhciBhPWIuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2I9Yi51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2UuYmIoYixhLFtdLGMsYyxtKX0pfW0uZyhsLmdsb2JhbENvbmZpZyxsLmNsaWVudENvbmZpZyxsLnByZWNoZWNrZWQsbC5vblJlYWR5LGwub25GYWlsdXJlLGwpO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBhPWwuc3RhcnRQbGF5ZXI7YSYmImZ1bmN0aW9uIj09PXR5cGVvZiBhJiZhKCl9fWZ1bmN0aW9uIHQoYyxhKXtpZihlLmRsKWUudHJhY2soInN0YXRzX2hkX2J5cGFzcyIsIiIsITApO2Vsc2UgaWYobCYmbSl7KGwuYWRUYWd8fGwucHJlcm9sbEFkVGFnKSYmYy5wYXVzZSgpO2UubyhrLkdjLGMubCgpKTtpZihjLmdldEN1cnJlbnRUaW1lKXt2YXIgYj1jLmdldEN1cnJlbnRUaW1lKCk7YiYmZS50cmFjaygiYWN0aXZhdGVkQXQiLApiKX1hP20uQ2E9ITA6ZS50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCk7Yj1uZXcgZmE7Yi5FZihjKTtiLmNvKG0pO2IuYm8obCk7Yi5TbigpO2IuZigpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0KGMsYSl9LmJpbmQodGhpcyksNTApfWZ1bmN0aW9uIGdhKGMsYSl7Yy5wYXVzZSgpO2lmKG0uemIubGVuZ3RoKXt2YXIgYj1tLnpiLnNoaWZ0KCk7aWYoImFkY2FsbCI9PWIudHlwZSl7dmFyIGY7Zj1lLmxvKHsiW0xPQURTQ1JJUFRdIjplLlkoMTApLCJbVVRJTFNdIjplLlkoMTApLCJbQ0FMTEJBQ0tdIjplLlkoMTApfSk7d2luZG93W2ZbIltMT0FEU0NSSVBUXSJdXT1lLkZoLmJpbmQoZSk7d2luZG93W2ZbIltVVElMU10iXV09bTtmb3Iod2luZG93W2ZbIltDQUxMQkFDS10iXV09ZnVuY3Rpb24oYil7Zm9yKHZhciBmIGluIGIpbFtmXT1iW2ZdO3QoYyxhKX07Zj1iLnNjcmlwdHMuc2hpZnQoKTspZS5GaChmLGZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIHN1Y2Nlc3MiKX0sCmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coInNpZGVsb2FkIGZhaWxlZCIpfSxtKX1lbHNlIHQoYyxhKX1lbHNlIHQoYyxhKX1jPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBoYT1jLmJsfHxoYTtuZXcgaGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5kbD0hMTt0aGlzLkxiPSJzZXR1cCI7dGhpcy5aYz1bXTt0aGlzLkNlKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuRG4uYmluZCh0aGlzKSk7dGhpcy50Yj17fTt0aGlzLnJoPXt9O3RoaXMuQmY9ITF9Yy5xaj1hO2EucHJvdG90eXBlPXtCbzpmdW5jdGlvbigpe3ZhciBiPSIiLGE7Zm9yKGEgaW4gdGhpcy50Yil0aGlzLnRiLmhhc093blByb3BlcnR5KGEpJiYoYis9CmErdGhpcy50YlthXSsiXyIpO3JldHVybiBifSxrYzpmdW5jdGlvbigpe3RoaXMuQmZ8fCh0aGlzLkJmPWUuWSgxMCkpO3JldHVybiB0aGlzLkJmfSx1YjpmdW5jdGlvbihiKXt0aGlzLnRiW2JdfHwodGhpcy50YltiXT0wKTt0aGlzLnRiW2JdKz0xOzU8dGhpcy50YltiXSYmIXRoaXMucmhbYl0mJih0aGlzLnJoW2JdPSEwLCJuZXdCaWdBZElkIj09YiYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuQm8oKSwhMCkpfSxDZTpmdW5jdGlvbigpe3RoaXMuWj17dXJsczp7fSxob21hZFVybHM6e30sb3JpZ2luYWxVcmxzOnt9LHNjcmlwdHM6e30sZXZlbnRsaXN0ZW5lcjpbXSxnZW5lcmFsRXZlbnRsaXN0ZW5lcjpbXSxpRnJhbWVzOltdLGlGcmFtZU9uTG9hZEhhbmRsZXI6e30saUZyYW1lVXJsOiIiLHRyYWNlOltdLHN0YWNrOltdLGVycm1zZzpbXX19LFJrOmZ1bmN0aW9uKGIpe3RoaXMuWi5lcnJtc2cucHVzaChiKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYixhKXt0cnl7Yi5jb250ZW50V2luZG93JiYKKGI9Yi5jb250ZW50V2luZG93KX1jYXRjaChkKXt9YiYmYi5wb3N0TWVzc2FnZSYmYi5wb3N0TWVzc2FnZShhLCIqIil9LGxhOmZ1bmN0aW9uKGIsYSxkKXt0aGlzLnBvc3RNZXNzYWdlKGIse3R5cGU6InZwYWlkIixldmVudDphLGRhdGE6ZH0pfSxEbjpmdW5jdGlvbihiKXtiJiZiLmRhdGEmJmIuZGF0YS50eXBlJiYidnBhaWQiPT1iLmRhdGEudHlwZSYmdGhpcy5DbihiLmRhdGEpfSxDbjpmdW5jdGlvbihiKXtpZih0aGlzLlomJnRoaXMuWi5ldmVudGxpc3RlbmVyKWZvcih2YXIgYT10aGlzLlouZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YTtkKyspdGhpcy5aJiZ0aGlzLlouZXZlbnRsaXN0ZW5lciYmdGhpcy5aLmV2ZW50bGlzdGVuZXJbZF0mJmIuZXZlbnQ9PXRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLm5hbWUmJnRoaXMuWi5ldmVudGxpc3RlbmVyW2RdLmNiKGIpfSx3ZTpmdW5jdGlvbihiLGEpe3RoaXMuWi5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YixjYjphfSl9LE5nOmZ1bmN0aW9uKGIpe3ZhciBhPQp0aGlzLmdoKGIpLGQ9ITE7aWYoYSlyZXR1cm4gdGhpcy5RYyhiLCJQT1NUIix7aG9tYWRfcmVzb2x2ZV9oYXNoOmF9LGZ1bmN0aW9uKGIpe3RyeXtkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpLnVybH1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sITAsITApLGR9LGdoOmZ1bmN0aW9uKGIpe3ZhciBhPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpO2lmKChhPWEuZXhlYyhiKSkmJihhWzJdfHxhWzVdKSl7aWYoYVsyXSlyZXR1cm4gYVsyXTtpZihhWzVdKXJldHVybiBhWzVdfWVsc2UgaWYoYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChhPWEuZXhlYyhiKSkmJmFbNF0pcmV0dXJuIGFbNF07cmV0dXJuITF9LFBrOmZ1bmN0aW9uKGIsYSl7aWYoYSYmISgwPnRoaXMuYWEoYikuaG9zdC5pbmRleE9mKCJkYW1vaCIpKSl7aWYoYj09CmEpe2lmKGUuT2woYikpcmV0dXJuOyhhPXRoaXMuTmcoYikpfHwoYT1iKX0wPT09YS5pbmRleE9mKCIvLyIpJiYoYT0iaHR0cHM6IithKTt0aGlzLloudXJsc1tiXT1hO3RoaXMuWi51cmxzW2FdPWI7dGhpcy5aLmhvbWFkVXJsc1tiXT1hO3RoaXMuWi5vcmlnaW5hbFVybHNbYV09Yn19LE9sOmZ1bmN0aW9uKGIpe3ZhciBhPSExO3RoaXMuWi5ob21hZFVybHNbYl0mJihhPXRoaXMuWi5ob21hZFVybHNbYl0pO3JldHVybiBhfSxYZzpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLloub3JpZ2luYWxVcmxzJiZ0aGlzLloub3JpZ2luYWxVcmxzW2JdJiYoYT10aGlzLloub3JpZ2luYWxVcmxzW2JdKTtyZXR1cm4gYX0sTW06ZnVuY3Rpb24oYil7cmV0dXJuImFib3V0OmJsYW5rIj09Ynx8ImFib3V0OnNlbGYiPT1ifHwiIj09Yn0sUGU6ZnVuY3Rpb24oYil7aWYoIWJ8fCJvYmplY3QiIT09dHlwZW9mIGIpcmV0dXJuIDA7dmFyIGE9MCxkPSIiO2ZvcihkIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShkKSYmCmErKztyZXR1cm4gYX0sZmg6ZnVuY3Rpb24oYixhKXt2YXIgZD1iW2FdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LG5vOmZ1bmN0aW9uKGIsYSxkKXtiJiYoYi5zdHlsZVthXT1kKX0sR2Y6ZnVuY3Rpb24oYixhKXtmb3IodmFyIGQ9dGhpcy5BbChhKSxnPTA7ZzxkLmxlbmd0aDtnKyspdGhpcy5ubyhiLGRbZ10ua2V5LGRbZ10udmFsdWUpfSxnbDpmdW5jdGlvbihiKXtpZigic3RyaW5nIiE9PXR5cGVvZiBiKXJldHVybiIiO3RyeXtyZXR1cm4gYi5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStiLnNsaWNlKDEpfWNhdGNoKGEpe3JldHVybiIifX0sQWw6ZnVuY3Rpb24oYil7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBhPVtdLGQ9e30sZz1kPSIiLHA9MDtwPGIubGVuZ3RoO3ArKyl7dmFyIGM9YltwXS5zcGxpdCgiOiIpLApkPWNbMF0udHJpbSgpO2NbMV0mJmNbMV0udHJpbT9nPWNbMV0udHJpbSgpOmc9IiI7ZC5pbmRleE9mJiYwPD1kLmluZGV4T2YoIi0iKSYmKGM9ZC5zcGxpdCgiLSIpLGQ9Y1swXSt0aGlzLmdsKGNbMV0pKTtkPXtrZXk6ZCx2YWx1ZTpnfTthLnB1c2goZCl9cmV0dXJuIGF9LE5mOmZ1bmN0aW9uKGIpe2Zvcig7YiE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YjspYj1iLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGI9PWRvY3VtZW50LmJvZHk/ITA6ITF9LEFoOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBiLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYj1iLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD1iLnRvcCYmMDw9Yi5sZWZ0JiZiLmJvdHRvbTw9KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJmIucmlnaHQ8PSh3aW5kb3cuaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKToKITE6ITF9LFllOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9MCxnPTAscD0wLGM9MCxlPSExO2lmKCFifHwhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGg9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighaClyZXR1cm4hMTtwPWguaGVpZ2h0Kmgud2lkdGg7ZD1oLndpZHRoO2c9aC5oZWlnaHQ7MD5oLnRvcCYmKGcrPWgudG9wKTtoLmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGctPWguYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKTswPmgubGVmdCYmKGQrPWgubGVmdCk7aC5yaWdodD4od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkmJihkLT1oLnJpZ2h0LSh3aW5kb3cuaW5uZXJXaWR0aHx8CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZyYmKGc9MCk7MD5kJiYoZD0wKTswPHAmJihjPTEwMC9wKmQqZyk7Yz49YSYmKGU9ITApO3JldHVybiBlfSxaZTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLlllKGIuZWwsYi5wZXJjZW50KTtiLnN0YXJ0VGltZXx8KGIuc3RhcnRUaW1lPShuZXcgRGF0ZSkuZ2V0VGltZSgpKTtpZihhKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1iLnN0YXJ0VGltZT49Yi50aW1lTVMpe2IuY2IoKTtyZXR1cm59fWVsc2UgYi5zdGFydFRpbWU9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlplKGIpfS5iaW5kKHRoaXMpLDEwMCl9LFFiOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYj9NYXRoLmFicyhiKToxMDtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCxiKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYil7Yj1iJiYibnVtYmVyIj09PXR5cGVvZiBiJiYKMDxiP01hdGgucm91bmQoYik6MTA7Zm9yKHZhciBhPSIiLGQ9MDtkPGI7ZCsrKWErPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41Pk1hdGgucmFuZG9tKCk/NjU6OTcpK01hdGguZmxvb3IoMjYqTWF0aC5yYW5kb20oKSkpO3JldHVybiBhfSxSZTpmdW5jdGlvbihiKXt2YXIgYT0wLGQsZztpZigwPT09Yi5sZW5ndGgpcmV0dXJuIGE7Zm9yKGQ9MDtkPGIubGVuZ3RoO2QrKylnPWIuY2hhckNvZGVBdChkKSxhPShhPDw1KS1hK2csYXw9MDtyZXR1cm4gYX0sSGY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShiKXt2YXIgZj0iIixkLGc7Zm9yKGQ9NzswPD1kO2QtLSlnPWI+Pj40KmQmMTUsZis9Zy50b1N0cmluZygxNik7cmV0dXJuIGZ9ZnVuY3Rpb24gZChiLGEpe3JldHVybiBiPDxhfGI+Pj4zMi1hfXZhciBnLHAsYz1BcnJheSg4MCksZT0xNzMyNTg0MTkzLGg9NDAyMzIzMzQxNyx6PTI1NjIzODMxMDIsaz0yNzE3MzM4NzgsbT0zMjg1Mzc3NTIwLG4sbCx5LHQscTtiPWImJiJzdHJpbmciPT09CnR5cGVvZiBiP2I6IiI7bj1iLmxlbmd0aDt2YXIgcj1bXTtmb3IoZz0wO2c8bi0zO2crPTQpcD1iLmNoYXJDb2RlQXQoZyk8PDI0fGIuY2hhckNvZGVBdChnKzEpPDwxNnxiLmNoYXJDb2RlQXQoZysyKTw8OHxiLmNoYXJDb2RlQXQoZyszKSxyLnB1c2gocCk7c3dpdGNoKG4lNCl7Y2FzZSAwOmc9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zz1iLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zz1iLmNoYXJDb2RlQXQobi0yKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMSk8PDE2fDMyNzY4O2JyZWFrO2Nhc2UgMzpnPWIuY2hhckNvZGVBdChuLTMpPDwyNHxiLmNoYXJDb2RlQXQobi0yKTw8MTZ8Yi5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcihyLnB1c2goZyk7MTQhPXIubGVuZ3RoJTE2OylyLnB1c2goMCk7ci5wdXNoKG4+Pj4yOSk7ci5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGI9MDtiPHIubGVuZ3RoO2IrPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWNbZ109cltiKwpnXTtmb3IoZz0xNjs3OT49ZztnKyspY1tnXT1kKGNbZy0zXV5jW2ctOF1eY1tnLTE0XV5jW2ctMTZdLDEpO3A9ZTtuPWg7bD16O3k9azt0PW07Zm9yKGc9MDsxOT49ZztnKyspcT1kKHAsNSkrKG4mbHx+biZ5KSt0K2NbZ10rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7Zm9yKGc9MjA7Mzk+PWc7ZysrKXE9ZChwLDUpKyhuXmxeeSkrdCtjW2ddKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSx0PXkseT1sLGw9ZChuLDMwKSxuPXAscD1xO2ZvcihnPTQwOzU5Pj1nO2crKylxPWQocCw1KSsobiZsfG4meXxsJnkpK3QrY1tnXSsyNDAwOTU5NzA4JjQyOTQ5NjcyOTUsdD15LHk9bCxsPWQobiwzMCksbj1wLHA9cTtmb3IoZz02MDs3OT49ZztnKyspcT1kKHAsNSkrKG5ebF55KSt0K2NbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHQ9eSx5PWwsbD1kKG4sMzApLG49cCxwPXE7ZT1lK3AmNDI5NDk2NzI5NTtoPWgrbiY0Mjk0OTY3Mjk1O3o9eitsJjQyOTQ5NjcyOTU7Cms9ayt5JjQyOTQ5NjcyOTU7bT1tK3QmNDI5NDk2NzI5NX1yZXR1cm4oYShlKSthKGgpK2EoeikrYShrKSthKG0pKS50b0xvd2VyQ2FzZSgpfSxwYjpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsZCxnLHAsYyxlLGgsej0wO3o8Yi5sZW5ndGg7KWQ9Yi5jaGFyQ29kZUF0KHorKyksZz1iLmNoYXJDb2RlQXQoeisrKSxwPWIuY2hhckNvZGVBdCh6KyspLGM9ZD4+MixkPShkJjMpPDw0fGc+PjQsZT0oZyYxNSk8PDJ8cD4+NixoPXAmNjMsaXNOYU4oZyk/ZT1oPTY0OmlzTmFOKHApJiYoaD02NCksYT1hKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKwoiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChoKTtyZXR1cm4gYX0sSG06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnZlbmRvciYmLTE8bmF2aWdhdG9yLnZlbmRvci5pbmRleE9mKCJBcHBsZSIpfSxsbDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IucGx1Z2lucyBpbnN0YW5jZW9mIFBsdWdpbkFycmF5JiYwIT1uYXZpZ2F0b3IucGx1Z2lucy5sZW5ndGg/d2luZG93LkhhPyEwOiExOiEwfSxBZDpmdW5jdGlvbigpe3ZhciBiPXt9LGE9ITEsZD0hMSxnPSExLHA9ITEsYz0hMSxlPSExLGg9ITEsej0hMSxrPSExLGw9ITE7dHJ5e2E9dGhpcy5sbCgpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKG0pe310cnl7Zz13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fApuYXZpZ2F0b3IuZWM/ITA6ITF9Y2F0Y2godCl7fXRyeXtwPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk9wZXJhIiksYz0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJGaXJlZm94IiksZT0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJTYWZhcmkiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxrPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLHo9IWgmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxsPShrfHxwKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHEpe31iLmlzUGhhbnRvbUpTPWE7Yi5pc0Nocm9tZUhlYWRsZXNzPWQ7Yi5pc0ZpcmVmb3hIZWFkbGVzcz1nO2IuaXNPcGVyYT1wO2IuaXNGaXJlZm94PWM7Yi5pc1NhZmFyaT1lO2IuaXNJRT1oO2IuaXNFZGdlPXo7Yi5pc0Nocm9tZT1rO2IuaXNCbGluaz1sO3JldHVybiBifSwKRGE6ZnVuY3Rpb24oKXt2YXIgYj17UWk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sWGk6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQmxhY2tCZXJyeS9pKX0sdW06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVBob25lfGlQYWR8aVBvZC9pKX0sUmo6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0seGs6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEVqOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sZ2s6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxaazpmdW5jdGlvbigpe3JldHVybiBiLlFpKCl8fApiLlhpKCl8fGIudW0oKXx8Yi5SaigpfHxiLnhrKCl8fGIuRWooKXx8Yi5naygpfX07cmV0dXJuIG51bGwhPWIuWmsoKX0sVGw6ZnVuY3Rpb24oYil7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxkLGc9YS5tYXRjaCgvKG9wZXJhfGNocm9tZXxzYWZhcml8ZmlyZWZveHxtc2llfHRyaWRlbnQoPz1cLykpXC8/XHMqKFxkKykvaSl8fFtdO2lmKC90cmlkZW50L2kudGVzdChnWzFdKSlyZXR1cm4gZD0vXGJydlsgOl0rKFxkKykvZy5leGVjKGEpfHxbXSwiSUUgIisoZFsxXXx8IiIpO2lmKCJDaHJvbWUiPT09Z1sxXSYmKGQ9YS5tYXRjaCgvXGIoT1BSfEVkZ2UpXC8oXGQrKS8pLG51bGwhPWQpKXJldHVybiBkLnNsaWNlKDEpLmpvaW4oIiAiKS5yZXBsYWNlKCJPUFIiLCJPcGVyYSIpO2lmKCFiKXJldHVybiBnWzFdO2c9Z1syXT9bZ1sxXSxnWzJdXTpbbmF2aWdhdG9yLmFwcE5hbWUsbmF2aWdhdG9yLmFwcFZlcnNpb24sIi0/Il07bnVsbCE9KGQ9YS5tYXRjaCgvdmVyc2lvblwvKFxkKykvaSkpJiYKZy5zcGxpY2UoMSwxLGRbMV0pO3JldHVybiBnLmpvaW4oIiIpfSxhYTpmdW5jdGlvbihiKXt2YXIgYT0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTtiPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYik7Zm9yKHZhciBkPXt9LGc9MTQ7Zy0tOylkW2FbZ11dPWJbZ118fCIiO2QucXVlcnlLZXk9e307ZFthWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYixhLGYpe2EmJihkLnF1ZXJ5S2V5W2FdPQpmKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXt9LGQ9W10sZz0wLHA9Yi5sZW5ndGg7ZzxwOysrZylhLmhhc093blByb3BlcnR5KGJbZ10pfHwoZC5wdXNoKGJbZ10pLGFbYltnXV09MSk7cmV0dXJuIGR9LFVhOmZ1bmN0aW9uKGIpe2I9dGhpcy5hYShiKS5ob3N0LnNwbGl0KCIuIik7dmFyIGE9IiI7YltiLmxlbmd0aC0yXSYmKGErPWJbYi5sZW5ndGgtMl0rIi4iKTtiW2IubGVuZ3RoLTFdJiYoYSs9YltiLmxlbmd0aC0xXSk7cmV0dXJuIGF9LEQ6ZnVuY3Rpb24oYil7dmFyIGE9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYT13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO2EmJi0xPGEuaW5kZXhPZihiKSYmKGQ9ITApO3JldHVybiBkfSxnbTpmdW5jdGlvbigpe3ZhciBiPSIiLGE9IiIsZD0iIjt0cnl7Yj13aW5kb3cubG9jYXRpb24uaG9zdCxhPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSwKd2luZG93IT13aW5kb3cudG9wJiYoYj13aW5kb3cudG9wLmxvY2F0aW9uLmhvc3QsYT13aW5kb3cudG9wLmxvY2F0aW9uLnBhdGhuYW1lKX1jYXRjaChnKXtkb2N1bWVudC5yZWZlcnJlciYmKGQ9dGhpcy5hYShkb2N1bWVudC5yZWZlcnJlciksYj1kLmhvc3QsYT1kLnBhdGgpfXJldHVybiBiK2F9LERsOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPVtdLGc9W10scD0wO3A8YS5sZW5ndGg7cCsrKWRbYVtwXV09ITA7Zm9yKHA9MDtwPGIubGVuZ3RoO3ArKylkW2JbcF1dfHxnLnB1c2goYltwXSk7cmV0dXJuIGd9LHRvOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9LTEsZz0iIjt0cnl7MDxiLmluZGV4T2YoIiUiKSYmMDxhPyhnPWIuc3BsaXQoIiUiKSxkPWEvMTAwKmcpOihkPWIuc3BsaXQoIjoiKSxkPTM2MDAqK2RbMF0rNjAqK2RbMV0rICtkWzJdLGQ9TWF0aC5yb3VuZChkKSl9Y2F0Y2gocCl7ZD0tMX1yZXR1cm4gaXNOYU4oZCk/LTE6ZH0sYWg6ZnVuY3Rpb24oYil7Yj1NYXRoLnJvdW5kKGIpOwp2YXIgYT0iLS06LS0iOzA8PWImJihiPU1hdGguZmxvb3IoYiksYT1NYXRoLmZsb29yKGIvNjApLGE9dGhpcy53aShhKSsiOiIrdGhpcy53aShNYXRoLmZsb29yKGItNjAqYSkpKTtyZXR1cm4gYX0sd2k6ZnVuY3Rpb24oYil7cmV0dXJuIDEwPmI/IjAiK2IudG9TdHJpbmcoKTpiLnRvU3RyaW5nKCl9LERmOmZ1bmN0aW9uKGIpe3RoaXMuTGI9Yn0sWWc6ZnVuY3Rpb24oYixhLGQpe3ZhciBnO2Quc3RhdGU9dGhpcy5MYjt0aGlzLnRlKGQpO3RyeXsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9nPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihnPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGcuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpLGIuZGlzcGF0Y2hFdmVudChnKX1jYXRjaChwKXt0aGlzLnduPSEwLGRvY3VtZW50LmJvZHk/KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIiksYi53aWR0aD0xLGIuaGVpZ2h0PTEsCmIuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKSxiPWIuY29udGVudFdpbmRvdyk6Yj13aW5kb3csd2luZG93LkN1c3RvbUV2ZW50PXt9LHdpbmRvdy5DdXN0b21FdmVudD1iLkN1c3RvbUV2ZW50LmJpbmQod2luZG93KX19LEpjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5ZZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZyxwLGMsaCl7dmFyIHg9YjtkJiZhJiYoYT1rLlNhKGEsZCkpO2EmJih4PWsuU2EoYixhKSk7ZyYmKHg9ay5TYSh4LGcpKTtwJiYoeD1rLlNhKHgscCkpO2MmJih4PWsuU2EoeCxjKSk7aCYmKHg9ay5TYSh4LGMpKTtlLkpjKHgpfSxGbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFja3x8Yi5jb3Jyb2JvcmF0ZV90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT0KYi5jb2RlfHwxMDE4PT1iLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGEuc2Vzc2lvbl9pZD1pYSk7YS5hZHNlc3Npb25faWQ9Yi5hZHNlc3Npb25faWQ/Yi5hZHNlc3Npb25faWQ6ImVwb24iO2IuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGEuYWRfaWQ9Yi5ob21hZEltcHJlc3Npb25BZElkKTthLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLmdtKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pO2IuZHVyYXRpb24mJihhLmFkX2R1cmF0aW9uPWIuZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sdW86ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD0KdGhpcy5rYygpO2IuZXZlbnRfY29kZXx8KGIuZXZlbnRfY29kZT05OTkwMCk7Yi5jb2RlPWIuZXZlbnRfY29kZTtiLmV2ZW50X25hbWV8fChiLmV2ZW50X25hbWU9Im5vbmFtZSIpO3RoaXMudGUoYil9LHRlOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRm4oYik7aWYoYSlpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMudGUoYSl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0ucGMoKTttLndhKGIsITApO2I9bS53YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLkthKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLAphLGQpfS5iaW5kKHRoaXMpLDUwMCk7ZWxzZSBpZihtLmlzRW5hYmxlZCl7YiYmYi50cmltJiYoYj1iLnRyaW0oKSk7YSYmYS50cmltJiYoYT1hLnRyaW0oKSk7dmFyIGc9bS5wYygpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYSk7bS53YShnLCEwKTtnPW0ud2EoZywhMCk7Zy5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zy5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtnLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5LYShnLGZ1bmN0aW9uKGQpe3ZhciBnPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihnPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihnPQohMSl9Y2F0Y2goYyl7fWd8fHRoaXMudHJhY2soInN0YXRzX2hkX3RyYWNrY2hlY2siLChkWzBdP2RbMF06IiIpKyhkWzFdP2RbMV06IiIpLCEwKX0uYmluZCh0aGlzKSl9fSxiZDpmdW5jdGlvbihiKXtpZighbXx8IW0uUyl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYmQoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKSxkPW0ucGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpLGQ9bS53YShkLCEwKTtkLmRhdGEuaG9tYWRfdHJhY2s9YTttLkthKGQpfX0sZ2Y6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0ubWwoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZ2YoKX0uYmluZCh0aGlzKSw1MDApfSxOZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMuc2IoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6CiIifSxRZTpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sc2I6ZnVuY3Rpb24oYil7cmV0dXJuIGI/dGhpcy5GZChiKToiIn0sRmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5RZShiKTthJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LHllOmZ1bmN0aW9uKGIsYSxkLGcpe2Q9ITE7aWYoYS4kZShiKXx8dGhpcy5NbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnpmJiZ3aW5kb3cuc2FuZGJveC56ZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTsKaWYodGhpcy5YZyhiKSlyZXR1cm4gdGhpcy5YZyhiKTt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtnJiZnLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2cmJmcub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmJiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9CiExfWUudXJsJiZlLmhhc2gmJihlPWEuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGUuaGFzaCkpO3RoaXMuUGsoZSxiKTtyZXR1cm4gZX0sYmI6ZnVuY3Rpb24oYixhLGQsZyxjLGUsaCx4KXt2YXIgaz1lfHxtO2U9ITA7eCYmKGU9ITEpO2lmKGsmJmsuUylpZihrLmlzRW5hYmxlZCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sud2EoYixlKTtlPWsud2EoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgdCBpbiBkKWUuZGF0YVt0XT1kW3RdO3JldHVybiBrLkthKGUsZyxjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iYihiLGEsZCxnLGMsayxoLHgpfS5iaW5kKHRoaXMpLDUwMCl9LFFjOmZ1bmN0aW9uKGIsYSxkLGcsYyxlLGgpe3ZhciB4PQohMDtoJiYoeD0hMSk7aWYoInN0cmluZyIhPXR5cGVvZiBkKXtoPWQ7ZD0iIjtmb3IodmFyIGsgaW4gaClkKz0iJiIraysiPSIrZW5jb2RlVVJJQ29tcG9uZW50KGhba10pO2Q9ZC5zdWJzdHIoMSl9dmFyIGw9bmV3IFhNTEh0dHBSZXF1ZXN0O2wub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWd8fDQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZyhsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLHgpLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gobSl7YyYmYygpfXJldHVybiBsfSxVbTpmdW5jdGlvbihiLGEsZCl7dGhpcy5RYyhiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7CmlmKHRoaXMuWmMpZm9yKHZhciBjIGluIHRoaXMuWmMpYj1iLnNwbGl0KGMpLmpvaW4odGhpcy5aY1tjXSk7Yz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtjLnR5cGU9InRleHQvamF2YXNjcmlwdCI7Yy5zcmM9ImRhdGE6dGV4dC9qYXZhc2NyaXB0O2Jhc2U2NCwiK2UucGIoYik7ZCYmKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSxGaDpmdW5jdGlvbihiLGEsZCxnKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPQoidHJ1ZSI7dGhpcy5iYihiLGcuQWEsYyxmdW5jdGlvbihiKXtiPWIucmVzcG9uc2VUZXh0O3RyeXtiPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7Yj0hMX10aGlzLlVtKGcuSGQoKS5yZXBsYWNlKCJbaGFzaF0iLGIuaGFzaCksYSxkKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30sZywhMCl9LGxvOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlpjPWJ9LGtiOmZ1bmN0aW9uKGIsYSxkLGcsYyl7dGhpcy5iYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsCmQucHJpY2VyYW5nZSksYT1hLnJlcGxhY2UoIltwaWRdIixkLnBpZCksYT1hLnJlcGxhY2UoIltwcmlvXSIsZC5wcmlvKSxhPWEucmVwbGFjZSgiW2RpZF0iLGQuZGlkKSxjKHtwbGFjZWhvbGRlcjphLG1hY3JvOmd9KSk6Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Z30pOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpnfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmd9KX0pfSwkazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0sRm06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKWlmKGFbZ109PQpiKXtkPSEwO2JyZWFrfXJldHVybiBkfSxnYjpmdW5jdGlvbihiKXtyZXR1cm4iVHJ1ZSI9PWJ8fCJ0cnVlIj09Ynx8MT09Ynx8IjEiPT1ifHwxPT1ifX19KShjKTt2YXIgUD1jLnFqfHxQO25ldyBQO3ZhciBlPW5ldyBQOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIpe3RoaXMuZGF0YT1ifHx7fX1jLnBqPWE7YS5TYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGc7Zm9yKGcgaW4gYSlkW2ddPWFbZ107Zm9yKGcgaW4gYilkW2ddPWJbZ107cmV0dXJuIGR9O2EueG49e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuaG49e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EudnA9e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5HbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnhwPQp7Y29kZToiMTAwNCIsdHlwZToibWFsZm9ybWF0dGVkWE1MIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLnRnPXtjb2RlOiIxMDA1Iix0eXBlOiJhZFN0YXJ0IixtZXNzYWdlOiIiLG5hbWU6ImFkU3RhcnQifTthLmxnPXtjb2RlOiIxMDA2Iix0eXBlOiJhZEZpcnN0UXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5xZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS51Zz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EuSGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2Eub2c9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5icD17Y29kZToiMTAxMSIsCnR5cGU6InZhc3RMb2FkaW5nRmFpbGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmduPXtjb2RlOiIxMDEyIix0eXBlOiJub0NyZWF0aXZlIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkhsPXtjb2RlOiIxMDEzIix0eXBlOiJlbXB0eVZhc3RGcm9tSG9tYWRTZXJ2ZXJFdmVudCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS53cD17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5KZz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLnlsPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS52ZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkdjPXtjb2RlOiIxMDE4IiwKdHlwZToiY29udGVudFBsYXllclBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJQYXVzZSJ9O2Euc2c9e2NvZGU6IjEwMTkiLHR5cGU6ImFkU2tpcHBlZCIsbWVzc2FnZToiIixuYW1lOiJhZFNraXBwZWQifTthLkprPXtjb2RlOiIxMDIwIix0eXBlOiJhZFJlcXVlc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5sZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EucWU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2Euc2U9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLklrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5EaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLmxuPXtjb2RlOiIxMDI2IiwKdHlwZToibm90Vmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToibm90Vmlld2FibGUifTthLkpkPXtjb2RlOiIxMDI3Iix0eXBlOiJtdXRlIixtZXNzYWdlOiIiLG5hbWU6Im11dGUifTthLlRmPXtjb2RlOiIxMDI4Iix0eXBlOiJ1bm11dGUiLG1lc3NhZ2U6IiIsbmFtZToidW5tdXRlIn07YS5LZz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EudXA9e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWW89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLlpvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Ybz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTsKYS5qbj17Y29kZToiOTAwMiIsdHlwZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCIsbWVzc2FnZToiIixuYW1lOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50In07YS5wcm90b3R5cGU9e2dldEVycm9yQ29kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX19fSkoYyk7dmFyIGs9Yy5wanx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYT1jLnltfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnJqPWE7YS5wcm90b3R5cGU9e1JlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxnLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZz1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStnLGF8PQowO3JldHVybiBNYXRoLmFicyhhKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkhhfHwieCIpfSxjbTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuSGF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sRGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD0KYiYmMTIyPj1iKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpO2lmKDA+PWIpcmV0dXJuIiI7aWYoNjU+YilyZXR1cm4gdGhpcy5EZChiKzY1KTtpZig5MDxiKXJldHVybiB0aGlzLkRkKE1hdGgucm91bmQoYi8yKSl9LHJldmVyc2U6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5SZSh0aGlzLmphKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMuRGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LEFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LHloOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuUmUodGhpcy5jbSgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLApkPTA7ZDxiLmxlbmd0aDtkKyspYSs9dGhpcy5EZChiW2RdKTswPT1hLmxlbmd0aCYmKGE9InpvcmsiKTtyZXR1cm4gYX19fSkoYyk7dmFyIEk9Yy5yanx8STtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYT1jLklufHxrYTtuZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihmKXt2YXIgZD10aGlzLnByb3RvdHlwZSxnPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBmKWdbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBmW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGZbY10pP2Z1bmN0aW9uKGIsCmEpe3JldHVybiBmdW5jdGlvbigpe3ZhciBmPXRoaXMuajt0aGlzLmo9ZFtiXTt2YXIgZz1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmo9ZjtyZXR1cm4gZ319KGMsZltjXSk6ZltjXTtmPSJmdW5jdGlvbiI9PT10eXBlb2YgZy5nP2cuaGFzT3duUHJvcGVydHkoImluaXQiKT9nLmc6ZnVuY3Rpb24oKXtkLmcuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zi5wcm90b3R5cGU9ZztnLmNvbnN0cnVjdG9yPWY7Zi5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGZ9O2MuYWo9YX0pKGMpO3ZhciBLPWMuYWp8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLm1uPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGE9Yy5tbnx8bGE7bmV3IGxhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Xaj1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLkxhPQp7fTt0aGlzLkc9bnVsbDt0aGlzLlZjPTEwMDt0aGlzLlJiPTA7dGhpcy5WYT0xNTA7dGhpcy5YYj0wO3RoaXMuZW8oYSl9LGY6ZnVuY3Rpb24oKXt9LFA6ZnVuY3Rpb24oKXt0aGlzLlJiPD10aGlzLlZhPyh0aGlzLlJiKyssdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSk6MD50aGlzLlZhJiYodGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKSl9LFhuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUmI+dGhpcy5WYT8hMDohMX0seWY6ZnVuY3Rpb24oKXt0aGlzLlJiPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxlbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuTGFbYS5qYSgpXT1hO0wmJkwuRWgmJkwuQW8oYSl9LGhxOmZ1bmN0aW9uKCl7cmV0dXJuIGUuUGUodGhpcy5MYSl9LE06ZnVuY3Rpb24oYSl7dmFyIGI9CmEudmlkZW9UYWcsZjtmb3IoZiBpbiB0aGlzLkxhKWlmKGI9PXRoaXMuTGFbZl0udmlkZW9UYWcpcmV0dXJuITA7cmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX0sR206ZnVuY3Rpb24oYSl7YT1hLlRhKCk7Zm9yKHZhciBiIGluIHRoaXMuTGEpaWYoYS5pZD09dGhpcy5MYVtiXS5UYSgpLmlkKXJldHVybiEwO3JldHVybiExfSx5cTpmdW5jdGlvbihhKXt0aGlzLkxhW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgcT1jLldqfHxxOyhmdW5jdGlvbihjKXtjLllqPUsuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuVmM9MTA7dGhpcy5SYj0wO3RoaXMuVmE9NTA7dGhpcy5XPW51bGw7dGhpcy5nYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuS2I9IiI7dGhpcy5QZz0hMTt0aGlzLkooKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZj10aGlzLlRhKCksCmQ9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvVGFnPWIpYS52aWRlb1RhZ0lkPWIuaWQ7aWYoYS5jb250YWluZXI9ZilhLmNvbnRhaW5lcklkPWYuaWQ7ZCYmKGEucGxheWVyPWQpO3JldHVybiBhfSxKOmZ1bmN0aW9uKCl7fSxNYTpmdW5jdGlvbigpe30scG86ZnVuY3Rpb24oYSl7dGhpcy5XPWF9LGlxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuV30saG86ZnVuY3Rpb24oYSl7dGhpcy5rZj1hfSxncTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtmfSxqZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuUmI8PXRoaXMuVmEmJih0aGlzLlJiKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksdGhpcy5WYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pOwplbHNlIGlmKGRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LndlYmtpdEV4aXRGdWxsc2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKWRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbigpO2Vsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sZWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5UYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sUWQ6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxBcTpmdW5jdGlvbigpe30sVjpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5xbSgpfHx0aGlzLkxrKCk7dGhpcy5RZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LApqcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZGVvVGFnfSxMazpmdW5jdGlvbigpe3RoaXMudmlkZW9UYWcuc2V0QXR0cmlidXRlKCJpZCIsZS5ZKDEwKSl9LHFtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxUOmZ1bmN0aW9uKGEpe3RoaXMuY29udGFpbmVyPWF9LFRhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LFdlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7CnJldHVybiBhJiZhLmR1cmF0aW9uP2EuZHVyYXRpb246MH0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4hMX0scnE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYX0sVTpmdW5jdGlvbigpe3RoaXMuZ2E9ITB9LFhjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxkZjpmdW5jdGlvbigpe3JldHVybiExfSxmaTpmdW5jdGlvbihhKXt0aGlzLktiPWF9LGZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuS2J9LCRoOmZ1bmN0aW9uKCl7dGhpcy5LYj1udWxsfSxscTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuS2ImJihhPSEwKTtyZXR1cm4gYX0sdnE6ZnVuY3Rpb24oKXt0aGlzLlBnfHwodGhpcy5QZz0hMCl9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGE9Yi5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBhfX0pfSkoYyk7dmFyIHI9Yy5Zanx8cjsoZnVuY3Rpb24oYyl7Yy5NaT1LLmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuRz10aGlzLnBsYXllcj0iIjt0aGlzLmlnPSIxIjt0aGlzLmpnPSIyIjt0aGlzLkVrPSIzIjt0aGlzLmdkPTA7dGhpcy5ibj0zMDt0aGlzLmFjPVtdO3RoaXMubGI9W107dGhpcy52Yz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy52Zz10aGlzLnlpPSExO3RoaXMuc3RhdHVzPXRoaXMuZ2Q7dGhpcy5pZD1lLlkoMTApO3RoaXMuRWYoYSk7dGhpcy5mbyhiKX0sZjpmdW5jdGlvbigpe30saWE6ZnVuY3Rpb24oKXt0aGlzLnlpfHwodGhpcy55aT0hMCxlLmdmKCkpfSxMaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEubmMmJiFtYSYmKG1hPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLAoiMTA0XyIrYSkpfSx6bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCksYj1uZXcgSTt3aW5kb3dbYi5mYSgpXXx8KHdpbmRvd1tiLmZhKCldPXt9KTt3aW5kb3dbYi5mYSgpXVthLmphKCldfHwod2luZG93W2IuZmEoKV1bYS5qYSgpXT17fSx3aW5kb3dbYi5mYSgpXVthLmphKCldLmluaXRpYXRvcj1lLmtjKCkpO3dpbmRvd1tiLmZhKCldW2EuamEoKV1bZS5rYygpXT93aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmphKCldW2Uua2MoKV09MX0sRG06ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZj1uZXcgSTt3aW5kb3dbZi5mYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXSYmd2luZG93W2YuZmEoKV1bYS5qYSgpXS5pbml0aWF0b3IhPWUua2MoKSYmKHRoaXMuRmYoKSxiPSExKTtyZXR1cm4gYn0sQzpmdW5jdGlvbihhLGIpe3ZhciBmPSEwO2EmJihmPSExKTtpZighdGhpcy56YSgpKXt0aGlzLnptKCk7CmlmKCF0aGlzLkRtKCkpe2UudHJhY2soInN0YXRzX2hkX2RvdWJsZU1haW4iLCIiLCEwKTt0aGlzLkZmKCk7cmV0dXJufXRoaXMuRmYoKTt0aGlzLkcodGhpcy5nZXRQbGF5ZXIoKSxmKTt0aGlzLnNpKCk7dGhpcy52Zz0hMDtiJiYiZnVuY3Rpb24iPT10eXBlb2YgYiYmYigpO3JldHVybiEwfXJldHVybiExfSxtOmZ1bmN0aW9uKGEsYil7dGhpcy56YSgpfHwodGhpcy5hYy5wdXNoKGEpLHRoaXMubGIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LHNpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5hYyYmMDx0aGlzLmFjLmxlbmd0aCYmKHRoaXMuYWM9ZS51bmlxdWUodGhpcy5hYyksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuYWMuam9pbigiLCIpKSk7aWYodGhpcy5sYil7Zm9yKHZhciBmPTA7Zjx0aGlzLmxiLmxlbmd0aDtmKyspdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl09PXRoaXMudmNbYV0mJmIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksdGhpcy52Y1t0aGlzLmxiW2ZdLnJlYXNvbl08CnRoaXMudmNbYV0mJihiPVtdLGIucHVzaCh0aGlzLmxiW2ZdLmRldGFpbCksYT10aGlzLmxiW2ZdLnJlYXNvbik7dGhpcy52Y1thXXx8KGE9InVua25vd24iLGI9W10pOzA8Yi5sZW5ndGgmJihmPWUudW5pcXVlKGIpLGE9YSsiLSIrZi5qb2luKCItIikpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCxiKX19LGtxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmlnfSxGZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuamd9LG1vOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5Fa30sbWE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmdkfSxuZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5pZ30sU3A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuamd9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmdkfSxFZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj0KYX0sZ2V0UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxmbzpmdW5jdGlvbihhKXt0aGlzLkc9YX0sYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxZbTpmdW5jdGlvbigpe319KX0pKGMpO3ZhciB1PWMuTWl8fHU7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnRtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmE9Yy50bXx8bmE7bmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuZWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLApmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sUjpmdW5jdGlvbigpe3JldHVybiJFeHBQbGF5ZXIifX0pfSkoYyk7dmFyIG9hPWMuZWp8fG9hOyhmdW5jdGlvbihjKXtjLmZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS5UcDtiP2IucGE/Yi5wYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxnPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZys9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZys9YS5nZXRNZXNzYWdlKCkpOwpnLmluZGV4T2YmJigwPD1nLmluZGV4T2YoIjEwMDkiKXx8MDw9Zy5pbmRleE9mKCIzMDMiKXx8MDw9Zy5pbmRleE9mKCI0MDMiKSk/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIpLHRoaXMuaSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmkoKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLmZqfHxwYTsoZnVuY3Rpb24oYyl7Yy5naj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmCndpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSl7dmFyIGE9bmV3IG9hKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyLmdldEFsbFBsYXllcnMoKVswXSk7dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgcGEoYSx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHFhPWMuZ2p8fHFhOyhuZXcgcWEodCkpLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuc249YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciByYT1jLnNufHxyYTtuZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt0aGlzLm9oPXRoaXMudmI9ITE7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthLmF1dGhvcml0eSYmYS5hdXRob3JpdHkuaW5kZXhPZiYmCjA8PWEuYXV0aG9yaXR5LmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKHRoaXMub2g9ITApO3RoaXMuT2g9ITE7dGhpcy5XZygpO3RoaXMuS2UoKTt0aGlzLnhsPSExfSxXZzpmdW5jdGlvbigpe3RoaXMudmI9ITE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2F8fCh0aGlzLnZiPSEwKTtpZigiT0JKRUNUIj09YS5ub2RlTmFtZXx8IlZJREVPIj09YS5ub2RlTmFtZSlhPWEucGFyZW50Tm9kZTt0aGlzLk9oPWE7aWYodGhpcy5vaCl7dGhpcy5LZSgpO2lmKHRoaXMudmIpcmV0dXJuO2E9dGhpcy52aWRlb1RhZy5wYXJlbnROb2RlLnBhcmVudE5vZGV9dGhpcy5UKGEpfSxLZTpmdW5jdGlvbigpe2lmKCF0aGlzLnZiKXt2YXIgYT10aGlzLk9oLGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMudmI9ITApO3RoaXMuVihiKX19LE1hOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMucGxheWVyO2lmKGwucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50KWEuX2V2ZW50cy5iZWZvcmVDb21wbGV0ZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OnRoaXMucGxheWVyLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5XJiYoMCx0aGlzLlcpKCl9LmJpbmQodGhpcyl9KTtlbHNlIGlmKGEuX2V2ZW50cyYmYS5fZXZlbnRzLnRpbWUmJmEuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYS5vblRpbWUpYS5vblRpbWUoZnVuY3Rpb24oYil7Yi5kdXJhdGlvbiYmYi5wb3NpdGlvbiYmMT5iLmR1cmF0aW9uLWIucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0samY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJgphLl9ldmVudHMuYWRFcnJvciYmYS5fZXZlbnRzLmFkRXJyb3IucHVzaCh7Y29udGV4dDpudWxsLGN0eDphLGNhbGxiYWNrOmZ1bmN0aW9uKGIpe3RoaXMuU2QoYil9LmJpbmQodGhpcyl9KTtpZihhLm9uQWRFcnJvcilhLm9uQWRFcnJvcihmdW5jdGlvbihiKXt0aGlzLlNkKGIpfS5iaW5kKHRoaXMpKX0sU2Q6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0UG9zaXRpb24oKTtiLmdldER1cmF0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Im1pZCI9PWEuYWRwb3NpdGlvbiYmYi5nZXRQb3NpdGlvbiYmMzA8Yi5nZXRQb3NpdGlvbigpJiYzMDxiLmdldER1cmF0aW9uKCktYi5nZXRQb3NpdGlvbigpJiZ0aGlzLmtmJiYoMCx0aGlzLmtmKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSwKcGF1c2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjtyZXR1cm4gYS5nZXRTdGF0ZSYmInBhdXNlZCI9PWEuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuInBhdXNlZCI9PXRoaXMucGF1c2UoKT8hMTohMH0sUjpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRGdWxsc2NyZWVuJiZhLmdldEZ1bGxzY3JlZW4oKSYmYS5zZXRGdWxsc2NyZWVuKCl9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnBsYXllcjtiLmdldE11dGUmJmIuZ2V0TXV0ZSgpJiYoYT0hMCk7cmV0dXJuIGF9LE1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgc2E9Yy56anx8c2E7KGZ1bmN0aW9uKGMpe2MueWo9CnUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEo6ZnVuY3Rpb24oKXt9LG1hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5nZDt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLnBlPSExO3RoaXMucmU9MTt0aGlzLmhkPVtdO3RoaXMuRWI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9e307aWYoYS5nZXRDb25maWcpaWYoYj1hLmdldENvbmZpZygpLGIuYWR2ZXJ0aXNpbmcpe2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUpaWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMpYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnJiZiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5yZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLAp0aGlzLkViPSEwKTtlbHNle2lmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUgaW5zdGFuY2VvZiBBcnJheSlmb3IodmFyIGY9MDtmPGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUubGVuZ3RoO2YrKylpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlW2ZdLnRhZyl7dGhpcy5FYj0hMDticmVha31iLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbC50YWcmJih0aGlzLkViPSEwKTtiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUmJmIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLkViPSEwKX1iLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMuRWI9ITApfWVsc2UgdGhpcy53KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKTtmb3IodmFyIGQ9ImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGY9MDtmPApkLmxlbmd0aDtmKyspYS5vbihkW2ZdLGZ1bmN0aW9uKGIpe3RoaXMudyhiLnR5cGUpOyJhZENvbXBsZXRlIj09PWRbZl0mJih0aGlzLnBlPSEwKTsiYWRJbXByZXNzaW9uIj09PWRbZl0mJnRoaXMuTGgoKX0uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oYil7dGhpcy5vbkFkRXJyb3IoYil9LmJpbmQodGhpcykpO2Eub24oInRpbWUiLGZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nPSEwO2IuZHVyYXRpb24+dGhpcy5ibiYmIXRoaXMuemEoKSYmKHRoaXMuRWI/KHRoaXMubSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMuaSgpKToodGhpcy5tKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGV2ZW50LmR1cmF0aW9uLzFFMykpLHRoaXMuaSghMCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGxheWxpc3RpdGVtIixmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMubWEoKSx0aGlzLmdldFBsYXllcigpLnhsPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuS2I7YiYmKGIuTGQoKSxiLndkKCkpfX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihhKXt2YXIgYj1hLnRhZzstMT09dGhpcy5oZC5pbmRleE9mKGIpJiZ0aGlzLmhkLnB1c2goYik7IjEwMSI9PWEuY29kZXx8IjEwMDEiPT1hLmNvZGU/KHRoaXMudygpLHRoaXMuaWEoKSk6OTAwPT1hLmNvZGUmJjA8YS5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1hLmNvZGUmJjA8YS5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLm0oImFkZXJyb3IiLGEuY29kZSksdGhpcy5oZC5sZW5ndGg+PXRoaXMucmUmJnRoaXMuaSgpKX0sWW06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxpOmZ1bmN0aW9uKGEpe2E/dGhpcy5KZT90aGlzLkplKys6dGhpcy5KZT0xOnRoaXMuSWU/CnRoaXMuSWUrKzp0aGlzLkllPTE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtlLk5mKGIudmlkZW9UYWcpP2IudmI/dGhpcy53KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5wZXx8dGhpcy5pc1BsYXlpbmc/KHRoaXMuSWU+dGhpcy5KZSYmKGE9ITEpLHRoaXMuQyhhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoYSl9LmJpbmQodGhpcyksNTApOihiLldnKCksYi5LZSgpLGIudmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy55anx8dGE7KGZ1bmN0aW9uKGMpe2MuQWo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5YbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9CmEuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8ZiYmZigpLmlkKXthPVtdO2lmKDE8Yi5sZW5ndGgpZm9yKGY9MDtmPGIubGVuZ3RoO2YrKylhLnB1c2goYltmXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYS5wdXNoKGp3cGxheWVyKCkuaWQpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBmPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpOwpmLnZifHx0aGlzLk0oZil8fHRoaXMuR20oZil8fCh0aGlzLk4oZiksZj1uZXcgdGEoZix0aGlzLkcpLGYuSigpLGYuZigpKX19dGhpcy5QKCl9fSxlcTpmdW5jdGlvbigpe3JldHVybiJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgifSxYbDpmdW5jdGlvbigpe3ZhciBhPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7cmV0dXJuIGUucGIoYS5hbmNob3IpfX0pfSkoYyk7dmFyIHVhPWMuQWp8fHVhLHZhPW5ldyB1YSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRmo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB3YT1jLkZqfHx3YTtuZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5zaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpOwppZihhKXt2YXIgYj1hLmVsXztifHwoYj1hLmVsKCkpO2I/KHRoaXMuVChiKSwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5WKGEpOnRoaXMuVSgpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGEpe3RoaXMuWWQoYSl9LmJpbmQodGhpcykpfSxZZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmN1cnJlbnRUaW1lKCksYT1hLmR1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMiYmdGhpcy5XJiZ0aGlzLlcoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiZGF0YS14LXNldHVwIik7aWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJgohYlsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGYpe31hPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmF1dG9wbGF5P2EuYXV0b3BsYXkoKTohMX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LHVhOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5pc0Z1bGxzY3JlZW47aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGYpe2I9ITF9YiYmYS5leGl0RnVsbHNjcmVlbigpfSxjdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7CnZhciB4YT1jLnNrfHx4YTsoZnVuY3Rpb24oYyl7Yy5yaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPXRoaXMuT2M9dGhpcy5CYT10aGlzLm9kPSExO3RoaXMuVmg9ZS5RYigxMCk7dGhpcy5VZj0hMDt0aGlzLkJjPXRoaXMudmg9ITE7dGhpcy5mbihhLmdldFJhd1BsYXllcigpKXx8KHRoaXMuS2goKSx0aGlzLmhsKCksdGhpcy55YigpKX0sZm46ZnVuY3Rpb24oYSl7cmV0dXJuIGUuRCgidC1vbmxpbmUuZGUiKT8hMT09PWEub3B0aW9uc18uYWRQcmVyb2xsOiExfSx3cTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkuamEoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLAphLlgsIjsiLHR5cGVvZiBhLlgsIjsiLCJwbGF5ZXIuYWRzLnN0YXRlOiIsIjsiLGEuWD9hLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IixhLlg/dHlwZW9mIGEuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGEuaW1hLCI7Iix0eXBlb2YgYS5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixhLkgsIjsiLHR5cGVvZiBhLkgsIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5pbWE/YS5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYS5IP2EuSC5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/CmEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5JYToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILklhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuaW1hJiZhLmltYS5JYT9hLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWEmJmEuaW1hLklhP3R5cGVvZiBhLmltYS5JYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixhLkgmJmEuSC5JYT9hLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLGEuSCYmYS5ILklhP3R5cGVvZiBhLkguSWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmU6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmU6InVuZGVmaW5lZFgiLAoiOyIsInBsYXllci5pbWEzLl9hZHNMb2FkZXI6IiwiOyIsYS5IP2EuSC5uZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm5lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEub2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5vZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILm9lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGEuaW1hP2EuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnBhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixhLkg/YS5ILnBhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkgucGE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsCiI7IixhLmltYT9hLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS54ZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5hZHNNYW5hZ2VyOiIsIjsiLGEuSD9hLkgueGU6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC54ZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLlZoKX0sTGM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuaW1hMyYmKHRoaXMuaW1hPWEuaW1hMyk7aWYoYS5pbWEpe3RoaXMuaW1hPWEuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LApNYzpmdW5jdGlvbigpe2lmKCF0aGlzLnBhKXt2YXIgYT10aGlzLkxjKCk7YSYmKGEuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmFkc0xvYWRlciksYS5fYWRzTG9hZGVyJiYodGhpcy5wYT1hLl9hZHNMb2FkZXIpLGEuZ2V0QWRzTG9hZGVyJiYodGhpcy5wYT1hLmdldEFkc0xvYWRlciksYS5jb250cm9sbGVyJiZhLmNvbnRyb2xsZXIuc2RrSW1wbCYmYS5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5wYT1hLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5wYX0saWg6ZnVuY3Rpb24oKXtpZighdGhpcy5PYyl7dmFyIGE9dGhpcy5MYygpO2EmJihhLmFkc01hbmFnZXImJih0aGlzLk9jPWEuYWRzTWFuYWdlciksYS5nZXRBZHNNYW5hZ2VyJiYodGhpcy5PYz1hLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLk9jfSxFbTpmdW5jdGlvbigpe2lmKCF0aGlzLnVoKXt2YXIgYT10aGlzLkxjKCksYj10aGlzLkNtKCk7d2luZG93LmltYSYmYSYmCihhLl9hZHNMb2FkZXJ8fGEuYWRzTG9hZGVyfHxiKSYmKHRoaXMudWg9ITApfXJldHVybiB0aGlzLnVofSxDbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMub2QmJmEuYWRzJiYoYS5hZHMuc3RhdGV8fGEuYWRzLl9zdGF0ZSkmJih0aGlzLm9kPSEwKTtyZXR1cm4gdGhpcy5vZH0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1jKCk7aWYoYSl7dmFyIGI9ImFkRXJyb3IiLGY9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQmJihmPWdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBhLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApOihhLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIsITApfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoZixmdW5jdGlvbigpe3RoaXMuUG4oKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5kYShiLAohMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKX0sUG46ZnVuY3Rpb24oKXt0aGlzLkJjPSEwO3ZhciBhPXRoaXMuaWgoKTtpZihhfHx0aGlzLnphKCkpe3ZhciBiPSJhZEVycm9yIixmPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihmPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7CmEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYil9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcihmLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYiwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspO3RoaXMuY2EoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLkRhKCkmJihkPSJNXyIpO2EuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImZpc3RxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7aWYoZS5EKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJtaWRwb2ludCIsIiIsITApO2UudHJhY2soInN0YXRzX2N1c3RfZG91YmxlcGxheSIsIWIucGF1c2VkKCksITApfX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMuQ2M9ITA7ZS5EKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5DYz0hMDtlLkQoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrImNvbXBsZXRlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLkNjPSEwO2UuRCgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5DY3x8KHRoaXMubSgiYWRlcnJvciIsIm5vYWRldmVudCIpLHRoaXMuY2EoKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxjcTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMuTWcmJmEuYWRzJiYodGhpcy5NZz1hLmFkcyk7cmV0dXJuIHRoaXMuTWd9LGhsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5tYSgpO3RoaXMuY2EoITApO3RoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTsKdGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGIpe3RoaXMuZGEoYik7dGhpcy5jYSgpO3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKX0uYmluZCh0aGlzKSk7YS5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYil7dGhpcy5kYShiKTt0aGlzLmNhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLkspfS5iaW5kKHRoaXMpKTthLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCk7dGhpcy5MaCgpfS5iaW5kKHRoaXMpKX0seWQ6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5TKWhvbWFkVXRpbHMuQ2EmJihhPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpLAo1MCk7cmV0dXJufWEmJigoYT10aGlzLmloKCkpJiZhLmRlc3Ryb3k/YS5kZXN0cm95KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnlkKCl9LmJpbmQodGhpcyksNTApKX0sS2g6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nKCkmJjA8YS5jdXJyZW50VGltZSgpKWlmKHRoaXMuRW0oKSl7dmFyIGI9dGhpcy5MYygpLGY9dGhpcy5NYygpO2ImJmYmJih0aGlzLkJjfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmM/dGhpcy53KCk6KHRoaXMuY2EoITApLHRoaXMubSgibm9BZHNNYW5hZ2VyIiwiYWRzTWFuYWdlciIpKX0uYmluZCh0aGlzKSwyRTMpKX1lbHNlIHRoaXMudmg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYj10aGlzLkxjKCksYT10aGlzLk1jKCk7YiYmIWE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5jYSgpKToodGhpcy5jYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsCiJJTUEiKSl9LmJpbmQodGhpcyksMTAwKTp0aGlzLnZoPSEwO2EuaXNQbGF5aW5nKCkmJjEwPGEuY3VycmVudFRpbWUoKXx8dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2goKX0uYmluZCh0aGlzKSw1MCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYixhKXt2YXIgZj0hMTtpZihiKXtpZigxMDA5PT1ifHwzMDM9PWJ8fDQwMz09YilmPSEwO2Z8fCFiLmluZGV4T2Z8fC0xPT09Yi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmCmIoZi5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LGlsOmZ1bmN0aW9uKCl7dGhpcy5IY3x8KHRoaXMuSGM9InVua25vd24iKTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRzKXtpZih0aGlzLkhjIT1hLmFkcy5zdGF0ZSYmKHRoaXMuSGM9YS5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuSGMpe3RoaXMudygiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5IYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaWwoKX0uYmluZCh0aGlzKSwxMCl9LAp3YjpmdW5jdGlvbigpe3JldHVybiBlLkdlPyExOnRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7aWYodGhpcy5ybSgpKXt0aGlzLnZhPSEwO2lmKGUuRCgiZ2lnYS5kZSIpfHxlLkQoInNwaWVsZXRpcHBzLmRlIil8fGUuRCgia2luby5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSl0aGlzLlVmPSExLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJzZXQiLCEwKTt0aGlzLmkoITApfWVsc2UgdGhpcy52YT0hMCx0aGlzLncoImVtcHR5IHZhc3QiKX0scm06ZnVuY3Rpb24oKXtpZigwPD1lLlVhKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLkspcmV0dXJuITA7aWYoZS5EKCJnaWdhLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgiZGVzaXJlZC5kZSIpKXt2YXIgYT0hMTtlLlFjKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTthPSFlLmdiKGIuY2MpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7YT0hMX0sITAsITApO3ZhciBiPWUuVGwoKS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLkdlPS0xIT1iLmluZGV4T2YoImZpcmVmb3giKXx8LTEhPWIuaW5kZXhPZigic2FmYXJpIil8fGF9cmV0dXJuITF9LGNhOmZ1bmN0aW9uKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy53YigpPyh0aGlzLncoKSx0aGlzLmlhKCkpOnRoaXMuaShhKX0uYmluZCh0aGlzKSwxMDApfSxpOmZ1bmN0aW9uKGEpe3RoaXMuemEoKXx8KGF8fCh0aGlzLlVmPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuQyh0aGlzLlVmLGZ1bmN0aW9uKCl7dGhpcy55ZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxybDpmdW5jdGlvbigpe3RoaXMubXF8fCgxMDx0aGlzLmhwPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwKInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmhwKyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMuV24oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmwoKX0uYmluZCh0aGlzKSw1MCkpKX0sV246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEudnBFdmVudCYmIXRoaXMuaXApe3RoaXMuaXA9ITA7dmFyIGI9IiI7YS52cEV2ZW50LnJhbmRvbVRlc3QmJihiPSIiKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIitiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5jYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsCiJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuY2EuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHNsb3QtY29tcGxldGUiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5ya3x8eWE7KGZ1bmN0aW9uKGMpe2MudGs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGI7Yj10aGlzLmppKHdpbmRvdyk7Zm9yKHZhciBmPTA7ZjxhLmxlbmd0aDtmKyspdHJ5e2I9Ynx8dGhpcy5qaShhW2ZdKX1jYXRjaChkKXt9dGhpcy5QKCl9fSxqaTpmdW5jdGlvbihhKXt2YXIgYj1bXTthLnZpZGVvanMmJmEudmlkZW9qcy5nZXRQbGF5ZXJzP2I9YS52aWRlb2pzLmdldFBsYXllcnMoKTphLnZpZGVvanMmJmEudmlkZW9qcy5wbGF5ZXJzJiYoYj1hLnZpZGVvanMucGxheWVycyk7MD09Yi5sZW5ndGgmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlb2pzLXBsYXllciIpKSYmYS5wbGF5ZXImJmEucGxheWVyLnBsYXllciYmKGE9YS5wbGF5ZXIucGxheWVyKCksYi5wdXNoKGEpKTtpZigwPGUuUGUoYikpe2Zvcih2YXIgZiBpbiBiKWIuaGFzT3duUHJvcGVydHkoZikmJihhPW5ldyB4YShiW2ZdKSxhLmdhfHx0aGlzLk0oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuTihhKSwKKG5ldyB5YShhLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5YYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlZjKX19KX0pKGMpO3ZhciB6YT1jLnRrfHx6YSxBYT1uZXcgemEodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgQmE9Yy4kanx8QmE7bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVGo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dGhpcy5xZj0wO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLnBsYXllckNvbnRhaW5lcjtpZighYiYmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuaWQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEucGxheWVySW5zdGFuY2UuaWQpKSYmCihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlUoKTtyZXR1cm59dGhpcy5UKGIpOyhhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YT90aGlzLlYoYSk6dGhpcy5VKCl9LHpuOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuS2IsZj10aGlzLmphKCksZD0iIjthLm1lbW8mJihkPWEubWVtby52aWRlb2lkKTtkJiZiJiZiLm5jJiYoMDw9Zi5pbmRleE9mKGQpfHxiLkxkKCkpfSxwYXVzZTpmdW5jdGlvbihhKXthfHwodGhpcy5xZj0wKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGEucGxheWVySW5zdGFuY2UucGF1c2UoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSwKd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSx1YTpmdW5jdGlvbigpe3RoaXMucWYrKztpZigxMDx0aGlzLnFmKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYS5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiExPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITA6ITA9PT1hLnBsYXllckluc3RhbmNlLnBhdXNlZD8KITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBhLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGEucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk92VmlkZW8ifSxNYTpmdW5jdGlvbigpe30sCllkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgUj1jLlRqfHxSOyhmdW5jdGlvbihjKXtjLlNqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTGUpaWYodGhpcy5NYnx8KHRoaXMuTWI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5NYisrLDE1PHRoaXMuTWIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuaSghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5MZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmRhKGIpO3RoaXMud2IoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5LKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBmPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWY9ITA7Znx8IWIuaW5kZXhPZnx8LTE9PT0KYi5pbmRleE9mKCIxMDA5IikmJi0xPT09Yi5pbmRleE9mKCIzMDMiKSYmLTE9PT1iLmluZGV4T2YoIjQwMyIpfHwoZj0hMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5LPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGZ9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZj1hLmdldEVycm9yKCk7aWYoZi5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBmLmdldEVycm9yQ29kZSYmYihmLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpOwpicmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMuSz10aGlzLkt8fCExO3RoaXMuQmEoKTt2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkpsPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5LKTt0aGlzLmkoKX0uYmluZCh0aGlzKSksdGhpcy5KbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYil7YS56bihiKX0uYmluZCh0aGlzKSkpOmEuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt3aW5kb3cub3YmJndpbmRvdy5vdi52aWRlbyYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyJiYodGhpcy5wbGF5ZXI9bmV3IFIod2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIuYWN0aXZlUGxheWVyKSk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIENhPWMuU2p8fENhOyhmdW5jdGlvbihjKXtjLlVqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuVmE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1bXTt3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiYKd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYT13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPGEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZj1uZXcgUihhW2JdKTtmLmdhfHx0aGlzLk0oZil8fCh0aGlzLk4oZiksCihuZXcgQ2EoZix0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIERhPWMuVWp8fERhLEVhPW5ldyBEYSh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMueG09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBGYT1jLnhtfHxGYTtuZXcgRmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy53aj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ZS5maChhLCJlbGVtZW50SUQiKTtzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLkJuPWEucG9zaXRpb25pbmc7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zi5zdHlsZS53aWR0aD1hLndpZHRoO2Yuc3R5bGUubWluV2lkdGg9CmEud2lkdGg7Zi5zdHlsZS5tYXhXaWR0aD1hLndpZHRoO2Yuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWluSGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWF4SGVpZ2h0PWEuaGVpZ2h0O2Yuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7Zi5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7c3dpdGNoKHRoaXMuQm4pe2Nhc2UgImJlZm9yZSI6Yi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShmLGIpO2JyZWFrO2Nhc2UgImFmdGVyIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7YnJlYWs7Y2FzZSAiaW5zaWRlIjpiLmFwcGVuZENoaWxkKGYpO2JyZWFrO2RlZmF1bHQ6Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChmLGIpfXRoaXMuVChmKTt0aGlzLlYoZik7dGhpcy5CZD1mfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuQmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkJkKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0scWw6ZnVuY3Rpb24oKXtlLkFoKHRoaXMuQmQpOwplLlllKHRoaXMuQmQpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xbCgpfS5iaW5kKHRoaXMpLDUwKX0sUjpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxkZjpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIEdhPWMud2p8fEdhOyhmdW5jdGlvbihjKXtjLnZqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLm0oImV4dGVybmFsIik7dGhpcy5DKCEwKX19KX0pKGMpO3ZhciBJYT1jLnZqfHxJYTsoZnVuY3Rpb24oYyl7Yy54aj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLlZhPTE1MDA7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCYmbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5maChhLCJlbGVtZW50SUQiKTtpZihlLkFoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTShhKSkpe3RoaXMuTihhKTsobmV3IElhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlhiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLAoxMDApfWVsc2UgdGhpcy5YYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgSmE9Yy54anx8SmEsS2E9bmV3IEphKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5GbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIExhPWMuRmx8fExhO25ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy51cmw9Yjt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5zaj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LE1rOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsCkpTT04uc3RyaW5naWZ5KGIpKX1jYXRjaChhKXt9fX19KShjKTt2YXIgQz1jLnNqfHxDOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGIsYSxkLGcsYyl7dGhpcy5GYT1iO3RoaXMuJGc9dGhpcy5HaT0hMTt0aGlzLk1oPWQ7dGhpcy5raT0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5GYT1uZXcgQyhiKSk7dmFyIGg9dGhpcy5qYj1uZXcgWE1MSHR0cFJlcXVlc3Q7aC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshYXx8NCE9aC5yZWFkeVN0YXRlfHwyMDAhPWguc3RhdHVzJiYyMDEhPWguc3RhdHVzfHxhKGgpO2QmJjQ9PWgucmVhZHlTdGF0ZSYmMjAwIT1oLnN0YXR1cyYmMjAxIT1oLnN0YXR1cz9kKGgpOjQ9PWgucmVhZHlTdGF0ZSYmMD09aC5zdGF0dXMmJm0mJm0uYWYodGhpcy5GYS51cmwpJiYhYyYmKGNvbnNvbGUubG9nKCJ0ZXN0MSIpLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwic3RhdHVzMCIsITApKTtnJiY0IT1oLnJlYWR5U3RhdGUmJmcoaCl9LmJpbmQodGhpcyl9CmMudGo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuRmEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiK2QrIj0iK2VuY29kZVVSSUNvbXBvbmVudChhW2RdKTtiPWIuc3Vic3RyKDEpfXRoaXMuJGcmJihiKz0iJmhvbWFkX2ZvbGxvd19yZWRpcmVjdHM9dHJ1ZSIpO3RoaXMuamIudXJsQ2FsbGVkPXRoaXMuRmEudXJsO3RyeXt0aGlzLmtpP3RoaXMuamIub3Blbih0aGlzLkZhLm1ldGhvZCx0aGlzLkZhLnVybCwhMSk6dGhpcy5qYi5vcGVuKHRoaXMuRmEubWV0aG9kLHRoaXMuRmEudXJsLCEwKSx0aGlzLkdpfHwodGhpcy5qYi53aXRoQ3JlZGVudGlhbHM9ITApLDA8Yi5sZW5ndGgmJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiksYlsiWC1Ib21hZC1Qb3N0Il0mJnRoaXMuamIuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Qb3N0IiwKInRydWUiKSx0aGlzLmpiLnNlbmQoYil9Y2F0Y2goZyl7Yj10aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpfHx0aGlzLkZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIiksbSYmbS5hZih0aGlzLkZhLnVybCkmJiFiP2UudHJhY2soInN0YXRzX2hkX3JlcXVlc3RfZmFpbGVkIiwiY2F0Y2giLCEwKTptLmFmKHRoaXMuRmEudXJsKSx0aGlzLk1oJiZ0aGlzLk1oKCl9cmV0dXJuIHRoaXMuamJ9fX0pKGMpO3ZhciBNYT1jLnRqfHxNYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuR2E9dGhpcy5rZT0hMX1jLmJqPWE7YS5wcm90b3R5cGU9e2tvOmZ1bmN0aW9uKGIpe3RoaXMua2U9Yn0sam86ZnVuY3Rpb24oYil7dGhpcy5HYT1ifSxVbjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoYixhKXtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbigpe30pfXZhciBhPXtDcDoiQWRDbGlja1RocnUiLEVwOiJBZEVycm9yIixGcDoiQWRTdG9wcGVkIiwKSXA6IkFkTGluZWFyQ2hhbmdlIixKcDoiQWRUYWdQYXJzZWQiLE1wOiJBZFZpZGVvQ29tcGxldGUiLFBwOiJBZExvYWRlZCIsUXA6IkFkU2tpcHBlZCIsUnA6IkFkU3RhcnRlZCIsR3A6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixIcDoiQWRJbXByZXNzaW9uIixEcDoiQWRDcmVhdGl2ZVZpZXciLEtwOiJBZFZpZGVvTWlkcG9pbnQiLExwOiJBZFBhdXNlZCIsTnA6IkFkVmlkZW9TdGFydCIsT3A6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5rZSxhW2RdKX0sVG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oKXt9KX1pZih0aGlzLkdhJiZ0aGlzLkdhLmplKWZvcih2YXIgYSBpbiB0aGlzLkdhLmplKXRoaXMuR2EuamUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuR2EsdGhpcy5HYS5qZVthXSk7dGhpcy5HYSYmdGhpcy5HYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5HYS5nZXRFcnJvcigpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMua2UmJnRoaXMuVW4oKTt0aGlzLkdhJiZ0aGlzLlRuKCl9fX0pKGMpO3ZhciBOYT1jLmJqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2E9ITE7dGhpcy5vYj0iIjt0aGlzLnBkPXRoaXMuZGM9dGhpcy5uYj1udWxsO3RoaXMuU2c9dGhpcy56Yj10aGlzLmNmPSExO3RoaXMuQWE9IiI7dGhpcy5iZj0hMTt0aGlzLnFhPXRoaXMuTmM9IiI7dGhpcy5YZT10aGlzLlM9dGhpcy5pc0VuYWJsZWQ9dGhpcy53Zj0hMTt0aGlzLmhhPVtdO3RoaXMuVGU9dGhpcy5UYj0iIjt0aGlzLmhlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuZ2U9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjsKdGhpcy5CYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7dGhpcy4kYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5VYj0iIjt0aGlzLlZiPVtdO3RoaXMuV2I9W107dGhpcy5hZD1bXTt0aGlzLnNjPSIiO3RoaXMuRmI9ITE7dGhpcy5YZD0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLm1jPSExO3RoaXMuSGc9dGhpcy5iZT1udWxsO3RoaXMuSmY9dGhpcy5oYj10aGlzLlJnPXRoaXMuJGQ9dGhpcy5WZj10aGlzLnJkPXRoaXMud2M9ITE7dGhpcy4kYT17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5HZD0wO3RoaXMucWg9ITE7dGhpcy5waD0xRTM7dGhpcy5EYz0hMTt0aGlzLlBhPTFFMzt0aGlzLmpkPXRoaXMua2Q9IiI7dGhpcy5rYj1udWxsO3RoaXMuSGk9ITE7dGhpcy5XYz1udWxsfWMudWo9YTthLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuQ2EsCmFkdGFncGFyYW1ldGVyOnRoaXMub2IsYWR0YWdtb2RpZmllcjp0aGlzLm5iLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy5kYyxhZHRhZ3JlZ2V4OnRoaXMucGQsYml0cmF0ZTp0aGlzLlBhLGpzcG9wdXBzOnRoaXMuY2Ysc2lkZWxvYWRzOnRoaXMuemIsZGlzYWJsZXRlc3RzOnRoaXMuU2csaG9tYWRBbGlhczp0aGlzLkFhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5iZixnbG9iYWxDb25maWc6dGhpcy5OYyxjbGllbnRDb25maWc6dGhpcy5xYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlMsaXNCbG9ja2VkOnRoaXMuWGUsc2VydmVyOnRoaXMuaGEsc3ZtQ29uZmlnOnRoaXMuVGIsaG9tYWRBZHBhdGg6dGhpcy5UZSxIT01BRF9WRVJJRklFRDp0aGlzLmhlLEhPTUFEX0JMT0NLRUQ6dGhpcy5nZSxIT01BRF9OT0JMT0NLRVI6dGhpcy5CYixIT01BRF9BREJMT0NLRVI6dGhpcy4kYix0ZXN0SGlkZTp0aGlzLlViLHRlc3RUYWdzOnRoaXMuVmIsdGVzdFRhZ3NKUzp0aGlzLldiLAp0ZXN0VGFnc1hIUjp0aGlzLmFkLHRlc3QzUENvb2tpZTp0aGlzLnNjLHRocm90dGxlOnRoaXMuWGQsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5tYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkhnLGFkQmxvY2tlckRldGVjdGVkOnRoaXMud2MsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnJkLHVzZVN0cmljdENoZWNrczp0aGlzLlZmLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLiRkLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuJGEsc2l0ZUNvbmZpZzp0aGlzLnlhLHNlcnZlcklkOnRoaXMuQWYsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmFiLHZwYWlkOnRoaXMuaGIsc2tpcEFsbG93ZWQ6dGhpcy5KZix2bWFwczp0aGlzLiRmLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5EYyxhZEZhbGxiYWNrVVJMOnRoaXMua2QsYWRGYWxsYmFja0NvbmZpZzp0aGlzLmpkLHlpZWxkbGFiOnRoaXMua2J9fSxhbzpmdW5jdGlvbihiKXsidW5kZWZpbmVkIiE9PQp0eXBlb2YgYi5pc0FjdGl2ZSYmKHRoaXMuQ2E9Yi5pc0FjdGl2ZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3BhcmFtZXRlciYmKHRoaXMub2I9Yi5hZHRhZ3BhcmFtZXRlcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyJiYodGhpcy5uYj1iLmFkdGFnbW9kaWZpZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdtb2RpZmllcl9hZHYmJih0aGlzLmRjPWIuYWR0YWdtb2RpZmllcl9hZHYpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWR0YWdyZWdleCYmKHRoaXMucGQ9Yi5hZHRhZ3JlZ2V4KTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmpzcG9wdXBzJiYodGhpcy5jZj1iLmpzcG9wdXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpZGVsb2FkcyYmKHRoaXMuemI9Yi5zaWRlbG9hZHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuZGlzYWJsZXRlc3RzJiYodGhpcy5TZz1iLmRpc2FibGV0ZXN0cyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFsaWFzJiYKKHRoaXMuQWE9Yi5ob21hZEFsaWFzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmlzSW5pdGlhbGl6ZWQmJih0aGlzLmJmPWIuaXNJbml0aWFsaXplZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5nbG9iYWxDb25maWcmJih0aGlzLk5jPWIuZ2xvYmFsQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNsaWVudENvbmZpZyYmKHRoaXMucWE9Yi5jbGllbnRDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNFbmFibGVkJiYodGhpcy5pc0VuYWJsZWQ9Yi5pc0VuYWJsZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNWZXJpZmllZCYmKHRoaXMuUz1iLmlzVmVyaWZpZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNCbG9ja2VkJiYodGhpcy5YZT1iLmlzQmxvY2tlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXImJih0aGlzLmhhPWIuc2VydmVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnN2bUNvbmZpZyYmKHRoaXMuVGI9Yi5zdm1Db25maWcpOyJ1bmRlZmluZWQiIT09CnR5cGVvZiBiLmhvbWFkQWRwYXRoJiYodGhpcy5UZT1iLmhvbWFkQWRwYXRoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX1ZFUklGSUVEJiYodGhpcy5oZT1iLkhPTUFEX1ZFUklGSUVEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0JMT0NLRUQmJih0aGlzLmdlPWIuSE9NQURfQkxPQ0tFRCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5IT01BRF9OT0JMT0NLRVImJih0aGlzLkJiPWIuSE9NQURfTk9CTE9DS0VSKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX0FEQkxPQ0tFUiYmKHRoaXMuJGI9Yi5IT01BRF9BREJMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdEhpZGUmJih0aGlzLlViPWIudGVzdEhpZGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3MmJih0aGlzLlZiPWIudGVzdFRhZ3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NKUyYmKHRoaXMuV2I9Yi50ZXN0VGFnc0pTKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3RUYWdzWEhSJiYKKHRoaXMuYWQ9Yi50ZXN0VGFnc1hIUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0M1BDb29raWUmJih0aGlzLnNjPWIudGVzdDNQQ29va2llKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRocm90dGxlJiYodGhpcy5YZD1iLnRocm90dGxlKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZpZGVvcGxhemEmJih0aGlzLnZpZGVvcGxhemE9Yi52aWRlb3BsYXphKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkVGVzdGVkJiYodGhpcy5tYz1iLmhvbWFkVGVzdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrJiYodGhpcy5IZz1iLmNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkQmxvY2tlckRldGVjdGVkJiYodGhpcy53Yz1iLmFkQmxvY2tlckRldGVjdGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmJsb2NrZWRXYXNDYWxsZWQmJih0aGlzLnJkPWIuYmxvY2tlZFdhc0NhbGxlZCk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIudXNlU3RyaWN0Q2hlY2tzJiYodGhpcy5WZj1iLnVzZVN0cmljdENoZWNrcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi51c2VTdHJpY3RDb25maWdDaGVja3MmJih0aGlzLiRkPWIudXNlU3RyaWN0Q29uZmlnQ2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmNvbmZpZ0ZhaWx1cmVzJiYodGhpcy4kYT1iLmNvbmZpZ0ZhaWx1cmVzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNpdGVDb25maWcmJih0aGlzLnlhPWIuc2l0ZUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5zZXJ2ZXJJZCYmKHRoaXMuQWY9Yi5zZXJ2ZXJJZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5lbmFibGVRdWFydGlsZVRyYWNraW5nJiYodGhpcy5hYj1iLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudnBhaWQmJih0aGlzLmhiPWIudnBhaWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2tpcEFsbG93ZWQmJih0aGlzLkpmPWIuc2tpcEFsbG93ZWQpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnZtYXBzJiYodGhpcy4kZj1iLnZtYXBzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFsdGVybmF0ZV9jbGlja3Rocm91Z2gmJih0aGlzLkRjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZEZhbGxiYWNrVVJMJiYodGhpcy5rZD1iLmFkRmFsbGJhY2tVUkwpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRGYWxsYmFja0NvbmZpZyYmKHRoaXMuamQ9Yi5hZEZhbGxiYWNrQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnlpZWxkbGFiJiYodGhpcy5rYj1iLnlpZWxkbGFiKX0sb206ZnVuY3Rpb24oKXt2YXIgYj0hMSxhO2ZvcihhIGluIHRoaXMuJGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmKGI9ITApO3JldHVybiBifSxDZjpmdW5jdGlvbihiKXt0aGlzLiRhW2JdPSEwfSxZbDpmdW5jdGlvbigpe3ZhciBiPVtdLGE7Zm9yKGEgaW4gdGhpcy4kYSkiYm9vbGVhbiI9PQp0eXBlb2YgdGhpcy4kYVthXSYmMT09dGhpcy4kYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxXZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2I9Yi5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2I9Yi5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5RYigxMCkudG9TdHJpbmcoKSk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7Yj1iLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYj1lLiRrKGIpfSx3YTpmdW5jdGlvbihiLGEsZCl7dmFyIGc9IiIsYz0iIixlPSIiLGg9IiI7aWYoIXRoaXMuQ2EmJiFhKXJldHVybiBuZXcgQyhiKTtnPXRoaXMuJGUoYik7CmM9dGhpcy5hYShiKTtnPyh0aGlzLlBjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMub2J8fHRoaXMubmJ8fHRoaXMuZGN8fHRoaXMucGQpJiYoaD10aGlzLmRuKGgpKTtiPW5ldyBDKGUpO2IudXJsPWU7ZT0iIjtlPWc/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuJGwoYy5ob3N0KTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWg7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMucGIoaCk7Yi5tZXRob2Q9IlBPU1QiO3JldHVybiBifSwkZTpmdW5jdGlvbihiKXt2YXIgYT0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwKImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLlBjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSxQYzpmdW5jdGlvbigpe3ZhciBiPSExLGE9IiI7dGhpcy5oYSYmdGhpcy5oYS5sZW5ndGgmJjA8dGhpcy5oYS5sZW5ndGgmJihhPXRoaXMuaGFbMF0sYT1hLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYT1hLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxhPWEucmVwbGFjZSgiLy8iLCIiKSxiPShiPWEuc3BsaXQoIi4iKSkmJmJbMF0mJiJbaGFzaF0iPT1iWzBdPyExOiEwKTtyZXR1cm4gYn0sYWY6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGIpO2QmJihkWzJdfHxkWzVdKT9hPSEwOmE9dGhpcy4kZShiKTtyZXR1cm4gYX0sCiRsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLllwO3JldHVybiJub25lIn0sSGQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYVt0aGlzLkFmXX0scGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkhkKCksYT10aGlzLkhmKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYi5yZXBsYWNlKCJbaGFzaF0iLGEuc2xpY2UoMCwtMSkrIiIrZFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqZC5sZW5ndGgpXSl9LEloOmZ1bmN0aW9uKGIsYSxkKXtiPSExO2E9IiI7aWYoZC5ldmFsKXRyeXthPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZyl7Yj0hMH1lbHNlIGI9ITA7YiYmIktFRVAiIT09ZC5mYWxsYmFjayYmCihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxjbjpmdW5jdGlvbihiLGEpe3ZhciBkPWUuYWEoYiksZz0iIixnPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxnPXt9LEI9MDtCPGgubGVuZ3RoO0IrKyl7dmFyIGs9aFtCXS5zcGxpdCgiPSIpO2dba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYVtjXS5zdWJ2YWx1ZXMpZ1tsXT10aGlzLkloKGdbbF0sbCxhW2NdLnN1YnZhbHVlc1tsXSk7aD1bXTtmb3IobCBpbiBnKWgucHVzaChsKyI9IitnW2xdKTtnPWg9ZW5jb2RlVVJJQ29tcG9uZW50KGguam9pbigiJiIpKX1lbHNlIGc9dGhpcy5JaChkLnF1ZXJ5S2V5W2NdLGMsYVtjXSk7ZC5xdWVyeUtleVtjXT1nfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGc9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LGRuOmZ1bmN0aW9uKGIpe3RoaXMub2ImJgooYis9dGhpcy5vYik7aWYodGhpcy5uYilmb3IodmFyIGEgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLm5iW2FdKSk7dGhpcy5kYyYmKGI9dGhpcy5jbihiLHRoaXMuZGMpKTtyZXR1cm4gYn0scGw6ZnVuY3Rpb24oKXt0aGlzLnlhJiZ0aGlzLnlhLmNsaWVudEFQSXMmJnRoaXMuamwodGhpcy55YS5jbGllbnRBUElzKX0samw6ZnVuY3Rpb24oYil7aWYoYil7dmFyIGE9bmV3IE5hO2IucHVibGlzaGVyQVBJJiZhLmtvKGIucHVibGlzaGVyQVBJKTtiLnBsYXllciYmYS5qbyhiLnBsYXllcik7YS5mKCl9fSxnOmZ1bmN0aW9uKGIsYSxkLGcsYyxlKXttPXRoaXM7dGhpcy5iZj0hMDt0aGlzLk5jPWI7dGhpcy5xYT1hO3RoaXMud2Y9ZDt0aGlzLmJlPWc7dGhpcy5oYz1jO3RoaXMueWE9ZXx8e307dGhpcy5wbCgpO3RoaXMuVG0oKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMucWEpdGhpcy5SbSgpO2Vsc2UgaWYoIm9iamVjdCIhPT0KdHlwZW9mIHRoaXMucWEpdHJ5e3RoaXMucWE9YSgpLHRoaXMuRmMoKX1jYXRjaChoKXt0aGlzLnNhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnFhKXRyeXt0aGlzLnFhPWEsdGhpcy5GYygpfWNhdGNoKGspe3RoaXMuc2EoIm5vQ2xpZW50Q29uZmlnIil9fSx4YjpmdW5jdGlvbihiKXt2YXIgYT1udWxsO3RyeXthPW5ldyBFdmVudChiKX1jYXRjaChkKXthPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpLGEuaW5pdEV2ZW50KCJjdXN0b20iLCEwLCExKX1yZXR1cm4gYX0sVG06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMuTmMrdGhpcy52ZSgiZ2xvYmFsIikpLHRoaXMubW0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImdsb2JhbCIpOyJvYmplY3QiPT10eXBlb2YgX2NsaWVudENvbmZpZyYmdGhpcy5GYygpfS5iaW5kKHRoaXMpLCEwKX0sUm06ZnVuY3Rpb24oKXt0aGlzLkthKG5ldyBDKHRoaXMucWErdGhpcy52ZSgiY2xpZW50IiwKLTEhPXRoaXMucWEuaW5kZXhPZigiPyIpKSksdGhpcy5GYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5DZigiY2xpZW50Iik7dGhpcy5zYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sdmU6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoiPyIpKygiY2FjaGU9Iit0aGlzLlFiKCkpO3RoaXMueWEmJnRoaXMueWEubm9DbGllbnRDb25maWdDYWNoZUJ1c3RlciYmImNsaWVudCI9PWImJihkPSIiKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2FjaGVCdXN0ZXImJihkPSIiKTtyZXR1cm4gZH0sc2E6ZnVuY3Rpb24oYil7aWYoIXRoaXMucmQpe3RoaXMucmQ9ITA7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYT0wO2E8Yi5sZW5ndGg7YSsrKXtpZihiW2FdJiZiW2FdLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgYlthXS5wYXVzZSl0cnl7YlthXS5wYXVzZSgpfWNhdGNoKGYpe31iW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSl9Yj0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7Yj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlb3BsYXllciIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXSYmYlthXS5wYXJlbnROb2RlJiZiW2FdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYlthXSk7aWYod2luZG93LnNlbGYhPXdpbmRvdy50b3ApZm9yKGI9d2luZG93LmRvY3VtZW50O2IuaGFzQ2hpbGROb2RlcygpOyliLnJlbW92ZUNoaWxkKGIubGFzdENoaWxkKX07IjRwbGF5ZXJzLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSYmKHRoaXMuaGM9CiExKTsiZm9jdXMuZGUiPT1lLlVhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5oYz0hMSk7dGhpcy5oYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmhjP3RoaXMuaGMoKTooYSgpLHdpbmRvdy5zZXRJbnRlcnZhbChhLDUwMCkpO3RoaXMuUz10aGlzLlhlPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLmdlKSk7dGhpcy5ZYigpO2UuSmMoay54bik7KGE9ZS5VYSh0aGlzLkhkKCkpKXx8KGE9ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sbW06ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9dmFyIGc9ITE7dHJ5e3ZhciBjPWUuYWEodG9wLmxvY2F0aW9uLmhyZWYpLmhvc3Q7YyYmYy5pbmRleE9mJiYwPD1jLmluZGV4T2YoInR2bm93IikmJgooZz0hMCl9Y2F0Y2goaCl7fWlmKCEoZ3x8YS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpJiZhLmhhc093blByb3BlcnR5KCJmb3JjZV9kaXNhYmxlZCIpKSl0cnl7YT0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoYS5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy5xYXx8dGhpcy5UYnx8dGhpcy5BYXx8dGhpcy5GYygpOih0aGlzLkNhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuUz0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpLHRoaXMuWWIoKSl9fSxGYzpmdW5jdGlvbihiKXt2YXIgYT0hMTtiJiYoYT1iLnJlc3BvbnNlVGV4dCk7dmFyIGQ9e307aWYoYSl0cnl7ZD1KU09OLnBhcnNlKGEpfWNhdGNoKGcpe2Q9dGhpcy5xYX1lbHNlIGQ9dGhpcy5xYTthPSExOwp0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31jPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPTA7YjxkLnNlcnZlci5sZW5ndGg7YisrKXt2YXIgYT1kLnNlcnZlcltiXTt0cnl7dmFyIGY7KGY9dm9pZCAwPT09YSl8fChmPSFhLnJlcGxhY2UoIltoYXNoXSIsdGhpcy5IZigobmV3IERhdGUpLmdldFRpbWUoKS50b1N0cmluZygpKSkubWF0Y2goUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW3cuLV0qKTo/LiooWzAtOV0rKT8vKFthLWYwLTldezQwfSkvPyQiLCJnIikpKTtpZihmKXJldHVybiExfWNhdGNoKGcpe3JldHVybiExfX1yZXR1cm4hMH0uYmluZCh0aGlzKTtpZighKGF8fGQuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKSYmZC5oYXNPd25Qcm9wZXJ0eSgic2VydmVyIikmJmMoKSYmZC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXMiKSYmZC5oYXNPd25Qcm9wZXJ0eSgiY29uZmlnIikpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuaXNFbmFibGVkPXRoaXMuZ2IoZC5lbmFibGVkKTt0aGlzLlM9IXRoaXMuaXNFbmFibGVkO3RoaXMuaGE9ZC5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLmhhLmxlbmd0aDtiKyspdGhpcy5oYVtiXT10aGlzLmhhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTtpZigoZS5EKCJ3ZWIuZGUiKXx8ZS5EKCJnbXgubmV0Iil8fGUuRCgiZ214LmF0Iil8fGUuRCgiZ214LmNoIil8fGUuRCgiMXVuZDEuZGUiKSkmJiF0aGlzLlBjKCkpZm9yKGI9MDtiPHRoaXMuaGEubGVuZ3RoO2IrKyl0aGlzLmhhW2JdPXRoaXMuaGFbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5laShkLmFkX2ZhbGxiYWNrX1VSTHx8IiIpO3RoaXMuamQ9ZC5hZF9mYWxsYmFja19jb25maWd8fAohMTt0aGlzLlRiPWQuY29uZmlnfHwiIjt0aGlzLkFhPWQuYWxpYXN8fG51bGw7dGhpcy5UZT1kLmFkcGF0aHx8IiI7dGhpcy5BZj1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5oYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLlRiJiZ0aGlzLkFhJiZ0aGlzLmhhLmxlbmd0aD90aGlzLlJjKCExKToodGhpcy5DYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKSx0aGlzLlliKCkpfSxlaTpmdW5jdGlvbihiKXt0aGlzLmtkfHwodGhpcy5rZD1ifHwiIil9LFJjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPXt9O2lmKGIpe3ZhciBhPW5ldyBDKHRoaXMucGMoKSksZD10aGlzLmFhKHRoaXMuVGIpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsCiIiKTthLm1ldGhvZD0iUE9TVCJ9ZWxzZSBhPW5ldyBDKHRoaXMuVGIrdGhpcy52ZSgiY3VzdG9tZXIiKSk7dGhpcy5LYShhLHRoaXMuRG8uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuQ2YoImN1c3RvbWVyIik7Yj90aGlzLmZrP3RoaXMuc2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuZms9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwxMDApKTp0aGlzLlJjKCEwKX0uYmluZCh0aGlzKSwhMCl9fSxEbzpmdW5jdGlvbihiKXtpZighdGhpcy5TKXt2YXIgYT1iLnJlc3BvbnNlVGV4dCxkPXt9O3RyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZyl7aWYoIXRoaXMubWMmJnRoaXMuaXNFbmFibGVkKXt0aGlzLm1jPSEwO3RoaXMuUmMoITApO3JldHVybn19YT0hMTt0cnl7dmFyIGM9ZS5hYSh0b3AubG9jYXRpb24uaHJlZikuaG9zdDtjJiZjLmluZGV4T2YmJjA8PWMuaW5kZXhPZigidHZub3ciKSYmKGE9ITApfWNhdGNoKGgpe31pZighKGF8fApkLmhhc093blByb3BlcnR5KCJlbmFibGVkIikmJihkLmhhc093blByb3BlcnR5KCJ0ZXN0aGlkZSIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzIil8fGQuaGFzT3duUHJvcGVydHkoInRlc3RhZHRhZ3NqcyIpfHxkLmhhc093blByb3BlcnR5KCJ0ZXN0YWR0YWdzeGhyIikpKSl0cnl7ZD0obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goQil7fXRoaXMuVmY9dGhpcy5nYihkLnN0cmljdCk7dGhpcy4kZD10aGlzLmdiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLlJnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5hYj10aGlzLmdiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5nYihkLmVuYWJsZWQpO3RoaXMuVWI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5XYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLmFkPWQudGVzdGFkdGFnc3hocnx8CltdO3RoaXMuc2M9ZC50ZXN0M3Bjb29raWV8fCIiO3RoaXMub2I9ZC5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy5uYj1kLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy5kYz1kLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMucGQ9ZC5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuY2Y9ZC5qc3BvcHVwc3x8ITE7dGhpcy56Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5oYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuaGI7dGhpcy5KZj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLnNkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy4kZj1kLnZtYXBzfHwiIjt0aGlzLkRjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5QYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmVpKGQuYWRfZmFsbGJhY2tfVVJMfHwiIik7dGhpcy5qZD1kLmFkX2ZhbGxiYWNrX2NvbmZpZ3x8ITE7dGhpcy5YZD1kLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1kLnZpZGVvcGxhemF8fHt9O3RoaXMua2I9CmQueWllbGRsYWJ8fG51bGw7IXRoaXMubWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLm1jPSEwLHRoaXMuUmMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMuT28oKSYmKHRoaXMuVWJ8fHRoaXMuV2J8fHRoaXMuVmJ8fHRoaXMuYWQpP3RoaXMud2Y/KHRoaXMuQ2E9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy54Yih0aGlzLkJiKSksdGhpcy5CZSgpLHRoaXMuWWIoKSk6dGhpcy5HbygpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlJmKCkpfX0sWG06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtiLnVybC5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkudG9TdHJpbmcoKSksYj17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQiLGhvbWFkX3VybF9zdWZmaXg6Yixob21hZF91cmxfc3VmZml4X2Jhc2U2NDplLnBiKGIpLGhvbWFkX2hhc2hfZ3Vlc3NlZDohMH07ZS5RYyh0aGlzLnBjKCksIlBPU1QiLGIsZnVuY3Rpb24oYil7dHJ5e3ZhciBhPQpKU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXt9ZS50cmFjaygic3RhdHNfaGRfeWxfZGF0YSIsISghYXx8IWEubGVuZ3RoKSwhMCk7dHJ5e2EmJmEubGVuZ3RoJiZ0aGlzLmtiLnBhcmFtZXRlciYmKHRoaXMub2IrPXRoaXMua2IucGFyYW1ldGVyLnNwbGl0KCJbaWRdIikuam9pbihhWzBdLmlkKSl9Y2F0Y2goYyl7fX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe30uYmluZCh0aGlzKSwhMCl9LEdvOmZ1bmN0aW9uKCl7dGhpcy5GbygpO3RoaXMuSG8oKX0sSG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifQp2YXIgYT0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zy53aWR0aD0xO2cuaGVpZ2h0PTE7Zy5zdHlsZS5kaXNwbGF5PSJub25lIjtnLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuWSgxMCksaD1lLlkoMTApLEI9ZS5ZKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihCLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZyk7Zy5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwpiKEIpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKStiKGgpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnBiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZyl9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUuQWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLkRhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApOwpyZXR1cm59dGhpcy5zYSgiY3NwXyIrYSl9ZS50cmFjaygic3RhdHNfaGRfY3NwIixhLCEwKX19LmJpbmQodGhpcyksMUUzKX0sUmY6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnhiKHRoaXMuQmIpKTt0aGlzLlliKCl9LCRjOmZ1bmN0aW9uKGIsYSl7dGhpcy53Yz0hMDt0aGlzLmtiJiYhdGhpcy5IaT8odGhpcy5YbSgpLHRoaXMuSGk9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoYixhKX0uYmluZCh0aGlzKSw1MDApKTp0aGlzLlN8fCh0aGlzLlM9dGhpcy5DYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIoYikpLHRoaXMuWWIoKSx0aGlzLkJlKCkpfSxGbzpmdW5jdGlvbigpe2lmKHRoaXMuVWIpe3ZhciBiPWUuQWQoKTtpZigoYi5pc0Nocm9tZXx8Yi5pc0ZpcmVmb3gpJiZ0aGlzLkptKCkpdGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgc3RldmUgaXMgYWxpdmUiKTtlbHNle2I9ITE7CnRyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuVWIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5VYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO2I9ZH1jYXRjaChnKXt9Yj90aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLm5pKCl9fWVsc2UgdGhpcy5uaSgpfSxQZjpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt0cnl7Zz1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuUWIoKSksdGhpcy5LbyhnLAowPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLk9mLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1jYXRjaChjKXt0aGlzLk9mKCl9fWZ1bmN0aW9uIGEoKXt0aGlzLiRjKHRoaXMuJGIsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5WYj10aGlzLmFkKSYmdGhpcy5WYi5sZW5ndGgpe3ZhciBkPXRoaXMuVmIuc2xpY2UoKSxnPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5PZigpfSxLbzpmdW5jdGlvbihhLGYsZCl7ZnVuY3Rpb24gZygpe2MoKSYmZigpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwhMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dGhpcy5LYShuZXcgQyhhKSxnLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sbmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dHJ5e2c9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIiwKdGhpcy5RYigpKSx0aGlzLkxvKGcsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5QZi5iaW5kKHRoaXMpLGYuYmluZCh0aGlzKSl9Y2F0Y2goYyl7dGhpcy5QZigpfX1mdW5jdGlvbiBmKCl7dGhpcy4kYyh0aGlzLiRiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2crIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLldiJiZ0aGlzLldiLmxlbmd0aCl7dmFyIGQ9dGhpcy5XYi5zbGljZSgpLGc7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLlBmKCl9LExvOmZ1bmN0aW9uKGEsZixkKXtmdW5jdGlvbiBnKCl7ZSgpJiZmKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtnKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGQsZil7Zj09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1nO2sub25lcnJvcj1jO2suc3JjPWE7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZygpfX0sT2Y6ZnVuY3Rpb24oKXtpZih0aGlzLnNjKXRyeXtlLlFjKHRoaXMuc2MsImdldCIsbnVsbCxmdW5jdGlvbihhKXthPUpTT04ucGFyc2UoYS5yZXNwb25zZVRleHQpO3RoaXMuRmI9IXRoaXMuZ2IoYS5jYyk7dGhpcy5SZigpfS5iaW5kKHRoaXMpLHRoaXMubGkuYmluZCh0aGlzKSwhMCl9Y2F0Y2goYSl7dGhpcy5saSgpfWVsc2UgdGhpcy5SZigpfSxsaTpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5CYikpO3RoaXMuWWIoKTt0aGlzLkJlKCl9LEptOmZ1bmN0aW9uKCl7dHJ5e3JldHVybiFKU09OLnBhcnNlKCd7ImVuYWJsZWQiOnRydWUsICJmb3JjZV9kaXNhYmxlZCI6dHJ1ZX0nKS5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpfWNhdGNoKGEpe3JldHVybiJmYWlsIn19LApZYjpmdW5jdGlvbigpe3ZhciBhPSIwIixmPSIwIjt0cnl7ZS5EYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLndjJiYoZj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitmLCEwKTsodGhpcy5DYSYmdGhpcy5pc0VuYWJsZWQmJmUuRCgiY2hpcC5kZSIpfHxlLkQoImZvY3VzLmRlIikpJiZ0aGlzLmNsKCk7dGhpcy5zYyYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzIix0aGlzLkZiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMueGIodGhpcy5oZSkpO3RoaXMuYmUmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5iZSYmdGhpcy5iZSh7aG9tYWRDb29raWVCeXBhc3M6dGhpcy5GYn0pfSxjbDpmdW5jdGlvbigpe3RoaXMuV2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5XYy5pZD1lLlkoMTApO3RoaXMuV2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLldjKTt2YXIgYT0KdGhpcy5XYy5jb250ZW50V2luZG93LGY9YS5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtmLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBkPWEuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZC50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Quc3JjPSJodHRwczovL3Vwcy54cGxvc2lvbi5kZS9sb2FkZXIvOTE2MjgvZGVmYXVsdC5qcz94cGxyZGlyPTEiO2EuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKX0uYmluZCh0aGlzKTtmLnNyYz1lLnllKCJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS9zYW5kYm94X3NhLmpzIix0aGlzKTthLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZik7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhO2E9KGE9ZG9jdW1lbnQuY29va2llLm1hdGNoKC8oXnwgKWFkcF9zZWdzPShbXjtdKykvKSk/YVsyXTp2b2lkIDA7YSYmZS50cmFjaygic3RhdHNfaGRfc2VncyIsImUwIiE9YSwhMCl9LmJpbmQodGhpcyksMkUzKX0sCm9sOmZ1bmN0aW9uKCl7aWYodGhpcy4kZCYmdGhpcy5vbSgpKXt2YXIgYT10aGlzLllsKCk7YSYmYS5qb2luJiZlLnRyYWNrKCJjb25maWdfZmFpbGVkIixhLmpvaW4oIl8iKSwhMCl9fSxzaTpmdW5jdGlvbihhKXthfHwoYT0iIik7aWYoInN0cmluZyIhPT10eXBlb2YgYSl0cnl7YT1hLnRvU3RyaW5nKCl9Y2F0Y2goZil7YT0iY291bGRfbm90X2NvbnZlcnRfdG9fc3RyaW5nIn1hPWEudHJpbSgpO2UudHJhY2soInN0YXRzX2hkX2FjdGl2YXRlZCIsYSwhMCl9LEthOmZ1bmN0aW9uKGEsZixkLGcsYyxoKXt0aGlzLkdkfHwodGhpcy5HZD0wKTt0aGlzLkdkKys7dGhpcy5HZD50aGlzLnBoJiYhdGhpcy5xaCYmKHRoaXMucWg9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLnBoLCEwKSk7YT1uZXcgTWEoYSxmLGQsbnVsbCxhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX2tleSIpJiZhLmRhdGEuaGFzT3duUHJvcGVydHkoImhvbWFkX3RyYWNrX3ZhbHVlIikpOwpnJiYoYS5HaT0hMCk7YyYmZS5IbSgpJiYoYS4kZz0hMCk7aCYmKGEua2k9ITApO3JldHVybiBhLmxvYWQoKX0sa2w6ZnVuY3Rpb24oKXt0aGlzLmFufHwodGhpcy5hbj0hMCxlLkRhKCl8fGUuYmIoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsImhvbWFkc3RhdGljdmFzdCIse2hvbWFkX2hhc2hfZ3Vlc3NlZDoidHJ1ZSJ9LGZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsLGc9IiI7dHJ5eyhmPWEucmVzcG9uc2VYTUwpfHwoZj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGMpe3RoaXMuc2EoIm1lZGlhZmlsZV9ub3htbCIpO3JldHVybn1pZihkKWlmKGc9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoZ1swXSYmKGc9Z1swXSksZyl7Zz1nJiZnLmNoaWxkTm9kZXMmJgpnLmNoaWxkTm9kZXNbMF0/Zy5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLlBjKCl8fChnPXRoaXMuYWEoZyksZz1nLnByb3RvY29sKyI6Ly8iK2cuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTthPWZ1bmN0aW9uKGEpe3ZhciBiPSIiO3RyeXthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJihiPWEudGFyZ2V0LmVycm9yLmNvZGUpfWNhdGNoKGQpe31lLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5zYSgibWVkaWFmaWxlX25vc291cmNlIitiKX07ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYS5iaW5kKHRoaXMpKTtlLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZGRhdGEiLGZ1bmN0aW9uKCl7IjEuMDQiIT1lLmR1cmF0aW9uJiZ0aGlzLnNhKCJtZWRpYWZpbGVfZHVyYXRpb24iKX0uYmluZCh0aGlzKSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwKYS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGYpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGcpO2UubG9hZCgpfWVsc2UgdGhpcy5zYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuc2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLnNhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5zYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKSl9LEVvOmZ1bmN0aW9uKCl7cmV0dXJuImFsbCI9PT10aGlzLiRmfSxtbDpmdW5jdGlvbigpe3RoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO3ZhciBhPXRoaXMud2EoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9CiJ0cnVlIjt0aGlzLkthKGEsdGhpcy5hcC5iaW5kKHRoaXMpLHRoaXMuJG8uYmluZCh0aGlzKSl9LGFwOmZ1bmN0aW9uKGEpe3ZhciBmPW51bGwsZD1udWxsO3RyeXsoZj1hLnJlc3BvbnNlWE1MKXx8KGY9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Zi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChnKXtyZXR1cm59ZHx8dGhpcy5JbCgpfSwkbzpmdW5jdGlvbigpe30sSWw6ZnVuY3Rpb24oKXtlLkpjKGsuSGwpO2UudHJhY2soImZhaWwtaW5pdCIsIjEwMSIpO3RoaXMuc2EoInZhc3RmaWxlTWFuaXB1bGF0aW9uIil9LEJlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMuemIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy56Yi5sZW5ndGg7YSsrKXt2YXIgZj10aGlzLnpiW2FdOyJyZXF1ZXN0Ij09Zi50eXBlJiZlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sCmZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWYudHlwZSl7dmFyIGQ9bmV3IEk7d2luZG93W2QuZmEoKV09dGhpcztlLmJiKGYudXJsLGYuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LHRoaXMpfX19LE9vOmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMuWGR9LFFiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LFk6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGY9IiIsZD0wO2Q8YTtkKyspZis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGZ9LGdiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PQphfHwxPT1hfSxwYjpmdW5jdGlvbihhKXtmb3IodmFyIGY9IiIsZCxnLGMsZSxoLGssbD0wO2w8YS5sZW5ndGg7KWQ9YS5jaGFyQ29kZUF0KGwrKyksZz1hLmNoYXJDb2RlQXQobCsrKSxjPWEuY2hhckNvZGVBdChsKyspLGU9ZD4+MixkPShkJjMpPDw0fGc+PjQsaD0oZyYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZyk/aD1rPTY0OmlzTmFOKGMpJiYoaz02NCksZj1mKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspOwpyZXR1cm4gZn0sYWE6ZnVuY3Rpb24oYSl7dmFyIGY9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7YT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxnPTE0O2ctLTspZFtmW2ddXT1hW2ddfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixmKXtiJiYoZC5xdWVyeUtleVtiXT1mKX0pO3JldHVybiBkfSxIZjpmdW5jdGlvbihhKXtmdW5jdGlvbiBmKGEpe3ZhciBiPQoiIixkLGY7Zm9yKGQ9NzswPD1kO2QtLSlmPWE+Pj40KmQmMTUsYis9Zi50b1N0cmluZygxNik7cmV0dXJuIGJ9ZnVuY3Rpb24gZChhLGIpe3JldHVybiBhPDxifGE+Pj4zMi1ifXZhciBnLGMsZT1BcnJheSg4MCksaD0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4NzgsdD0zMjg1Mzc3NTIwLG4scSxyLHUsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihnPTA7ZzxuLTM7Zys9NCljPWEuY2hhckNvZGVBdChnKTw8MjR8YS5jaGFyQ29kZUF0KGcrMSk8PDE2fGEuY2hhckNvZGVBdChnKzIpPDw4fGEuY2hhckNvZGVBdChnKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpnPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpnPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmc9YS5jaGFyQ29kZUF0KG4tMyk8PAoyNHxhLmNoYXJDb2RlQXQobi0yKTw8MTZ8YS5jaGFyQ29kZUF0KG4tMSk8PDh8MTI4fWZvcih3LnB1c2goZyk7MTQhPXcubGVuZ3RoJTE2Oyl3LnB1c2goMCk7dy5wdXNoKG4+Pj4yOSk7dy5wdXNoKG48PDMmNDI5NDk2NzI5NSk7Zm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZz0wOzE2Pmc7ZysrKWVbZ109d1thK2ddO2ZvcihnPTE2Ozc5Pj1nO2crKyllW2ddPWQoZVtnLTNdXmVbZy04XV5lW2ctMTRdXmVbZy0xNl0sMSk7Yz1oO249aztxPWw7cj1tO3U9dDtmb3IoZz0wOzE5Pj1nO2crKyl2PWQoYyw1KSsobiZxfH5uJnIpK3UrZVtnXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz0yMDszOT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7Zm9yKGc9NDA7NTk+PWc7ZysrKXY9ZChjLDUpKyhuJnF8biZyfHEmcikrdStlW2ddKzI0MDA5NTk3MDgmCjQyOTQ5NjcyOTUsdT1yLHI9cSxxPWQobiwzMCksbj1jLGM9djtmb3IoZz02MDs3OT49ZztnKyspdj1kKGMsNSkrKG5ecV5yKSt1K2VbZ10rMzM5NTQ2OTc4MiY0Mjk0OTY3Mjk1LHU9cixyPXEscT1kKG4sMzApLG49YyxjPXY7aD1oK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtxJjQyOTQ5NjcyOTU7bT1tK3ImNDI5NDk2NzI5NTt0PXQrdSY0Mjk0OTY3Mjk1fXJldHVybihmKGgpK2YoaykrZihsKStmKG0pK2YodCkpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLnVqfHxPYSxtPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuQms9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBQYT1jLkJrfHxQYTtuZXcgUGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZixkKXt0aGlzLmE9CmE7YS5jLlI/dGhpcy5lYj1hLmMuUigpOnRoaXMuZWI9IiI7YS5jLnhoJiZhLmMueGgoe3BhdXNlOnRoaXMuTGQuYmluZCh0aGlzKSxyZXN1bWU6dGhpcy5iaS5iaW5kKHRoaXMpLG11dGU6dGhpcy5sZi5iaW5kKHRoaXMpLHVubXV0ZTp0aGlzLlZvLmJpbmQodGhpcyl9KTt0aGlzLmNvbnRhaW5lcj10aGlzLmEucmI7dGhpcy5wbGF5ZXI9dGhpcy5hLmM7dGhpcy5pYz10aGlzLnFkPSExO3RoaXMuWWs9MUUzO3RoaXMudGE9bnVsbDt0aGlzLkE9Zjt0aGlzLmliPXt9O3RoaXMudmlkZW89e307dGhpcy5VZD17fTtlLnViKCJuZXdCaWdBZElkIik7dGhpcy5hbD1lLlkoMTApO3RoaXMuTGY9MDt0aGlzLm5kPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMubmQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMubmQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYKInRydWUiPT1TdHJpbmcoZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcikmJih0aGlzLlNrPWQuYWRqdXN0QWRWb2x1bWVUb0NvbnRlbnRQbGF5ZXIpO3RoaXMuVWM9dGhpcy5UZD0hMTt0aGlzLkdoPWQmJmQubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGQubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLmI9e307dGhpcy51ZT0hMTt0aGlzLnZpPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMubmM9ITE7dGhpcy56bD1lLlkoMTApO3RoaXMuUGI9ZS5ZKDEwKTt0aGlzLk5iPWUuWSgxMCk7dGhpcy5naT1lLlkoMTApO3RoaXMuY29uZj17fTt0aGlzLmNlPXRoaXMuWmI9dGhpcy5GZT10aGlzLnhkPXRoaXMuVmQ9dGhpcy5BYj10aGlzLnVjPXRoaXMuUGg9dGhpcy5FZT10aGlzLkNkPXRoaXMuUG89dGhpcy5EYj10aGlzLk9iPSExO3RoaXMuemM9W107dGhpcy5vYz17fTt0aGlzLnRuPTIwMDt0aGlzLmNnPXRoaXMuY2Q9dGhpcy5FYz10aGlzLmJnPXRoaXMudmY9ITE7CnRoaXMubmY9e319Yy5vaj1hO2EucHJvdG90eXBlPXskbjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSmE6ZnVuY3Rpb24oYSl7dmFyIGY9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmViXSYmdGhpcy5jb25mW3RoaXMuZWJdW2FdJiYoZj10aGlzLmNvbmZbdGhpcy5lYl1bYV0pO3JldHVybiBmfSx0aTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5MYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLllhKCksITApO3RoaXMud28oKTtlLm8oay5Kayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxmZjpmdW5jdGlvbihhLGYsZCxjKXt0aGlzLkRiPWQ7dmFyIGg9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGg9ITApO2lmKHRoaXMuQS5TKXRoaXMuTGYrKyxlLnViKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkEub2woKSxjPW0uZ2V0Q29uZmlnKCksZS5HZSYmKHRoaXMuQS5hbyh7YWR0YWdwYXJhbWV0ZXI6IiZzdm0tZGF0PTEifSksCmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQS5DYSYmdGhpcy5BLmlzRW5hYmxlZD8odGhpcy50aSgpLG5ldyBTKHRoaXMsYSx0aGlzLkdoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpmLGJpdHJhdGU6Yy5QYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQS5oYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpmPyh0aGlzLnRpKCksbmV3IFModGhpcyxhLHRoaXMuR2gse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLkEuaGIsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsYml0cmF0ZTpjLlBhLGtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6aCxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYS5jLmdldER1cmF0aW9uKCksCmN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUWEoKTtlbHNle3ZhciB3Yz10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt3Yy5mZihhLGYsZCl9LDUwKX19LHJmOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsImFkIiwhMCk7dGhpcy5jZT10aGlzLlpiPXRoaXMuRWU9dGhpcy5DZD0hMTt0aGlzLmI9YTt0aGlzLnFvKHRoaXMuYik7dGhpcy5saChhKTt0aGlzLnpjPXRoaXMuYmgoYSk7dGhpcy5zbCgpfSxsaDpmdW5jdGlvbihiKXtiJiYoYi5vcmlnaW4mJihiPWIub3JpZ2luKSxiLnBhcmVudCYmYi5wYXJlbnQgaW5zdGFuY2VvZiBhJiYodGhpcy5VZD10aGlzLmltKGIpKSx0aGlzLmxoKGIucGFyZW50KSl9LGJoOmZ1bmN0aW9uKGIpe3ZhciBmPVtdO2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLCFifHwhYi5wYXJlbnR8fGIucGFyZW50IGluc3RhbmNlb2YgYXx8KGY9dGhpcy5iaChiLnBhcmVudCkpLGYucHVzaCh0aGlzLlNsKGIpKSk7CnJldHVybiBmfSxTbDpmdW5jdGlvbihhKXt2YXIgZj0iIixkPVtdO2lmKGEmJmEuTCYmYS5MLmdldEF0dHJpYnV0ZSl7Zj1hLkwuZ2V0QXR0cmlidXRlKCJpZCIpO2E9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWQucHVzaChhW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSk7MT09ZC5sZW5ndGgmJihkPWRbMF0pfXJldHVybnthZElEOmYsY3JlYXRpdmVJRDpkfX0saW06ZnVuY3Rpb24oYSl7dmFyIGY9W10sZD1bXSxjPVtdLGU9W10saD0iIjtpZihhLkwpe2Y9YS5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIik7Yz1hLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpO2EuTC5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmKGg9YS5MLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKHZhciBrPQowO2s8Yy5sZW5ndGg7aysrKWNba10uZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1jW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSxlLnB1c2goaCkpLGNba10uZ2V0QXR0cmlidXRlKCJhZElEIikmJihoPWNba10uZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKWQucHVzaChhLnNiKGZba10pKX1yZXR1cm57aW1wcmVzc2lvbnM6ZCxhZElkczplLGFkSWQ6aH19LHJhOmZ1bmN0aW9uKGEpe2EuWmEmJmUudHJhY2soInN0YXRzX2hkX3dyYXBwZXJzYyIsIm5vYWQiLCEwKTt2YXIgZj0wO2EmJihhLmVycm9yJiZhLmVycm9yLmRldGFpbCYmYS5lcnJvci5kZXRhaWwuY29kZSYmKGY9YS5lcnJvci5kZXRhaWwuY29kZSksYS56ZCYmYS56ZC5lcnJvciYmYS56ZC5lcnJvci5jb2RlJiYoZj1hLnpkLmVycm9yLmNvZGUpKTtzd2l0Y2goYS5lcnJvci5jb2RlKXtjYXNlIHYuZWQuY29kZTpmPT1GLmxlLmNvZGU/ZS5vKGsudnAsdGhpcy5iLnMsdGhpcy5hLmMubCgpLAp0aGlzLnYoKSx0aGlzLnUoKSk6KGUuZ2YoKSxmPT1GLmdnLmNvZGUmJmUubyhrLmduLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpO2UubyhrLkdsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy54bygpO3RoaXMuV2EoImVtcHR5Iik7dGhpcy5BLkZiJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3NfZW1wdHkiLHRoaXMuRmIsITApO2JyZWFrO2Nhc2Ugdi5lZy5jb2RlOmUubyhrLmJwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgidmFzdGxvYWRmYWlsZWQiKTticmVhaztjYXNlIHYuaGcuY29kZTplLm8oay53cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuV2EoIndyYXBwZXJsaW1pdCIpO2JyZWFrO2Nhc2Ugdi5tZS5jb2RlOmUubyhrLnhwLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dGhpcy5XYSgieG1scGFyc2UiKTsKYnJlYWs7Y2FzZSB2LmllLmNvZGU6ZS5vKGsuaG4sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJub21lZGlhIik7YnJlYWs7Y2FzZSB2LmZlLmNvZGU6ZS5vKGsuWW8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdW1teWFkIik7YnJlYWs7Y2FzZSB2LmRnLmNvZGU6ZS5vKGsuWm8sdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLldhKCJkdXJhdGlvbiIpO2JyZWFrO2RlZmF1bHQ6dGhpcy5XYSgidW5rbm93biIpfXRoaXMuamMoYSk7dGhpcy5RYSgpfSxqYzpmdW5jdGlvbihhKXt2YXIgZj05MDA7YSYmYS5lcnJvciYmYS5lcnJvci5jb2RlJiYoZj1hLmVycm9yLmNvZGUsOTAxPGYmJihmPTkwMCkpO2ZvcihmPXsiW0VSUk9SQ09ERV0iOmZ9O2EuT2EubGVuZ3RoOyl0cnl7dmFyIGQ9YS5PYS5wb3AoKTt0aGlzLmVmKGQudXJsLGQudHlwZSxmKX1jYXRjaChjKXt9fSwKcW86ZnVuY3Rpb24oYSl7dGhpcy5GZT0hMTt0aGlzLmliPXRoaXMuYS5JO3RoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0mJmUuR2YodGhpcy5pYix0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdKTt2YXIgZj05OTk5O3RoaXMuY29uZi56SW5kZXgmJihmPXRoaXMuY29uZi56SW5kZXgtMSk7dGhpcy5pYi56SW5kZXg9ZjtmPXRoaXMuYS5CO3RyeXt2YXIgZD10aGlzLmEuYy5nZXRSYXdQbGF5ZXIoKSxjPSIiO2QmJmQuZW52dmFycyYmKGM9ZC5lbnZ2YXJzKCkpO2MudmlkZW9TbG90fHwoZD10aGlzLmEuYykmJmQuRWQmJihjPWQuRWQoKSk7Yy52aWRlb1Nsb3QmJihmPWMudmlkZW9TbG90LHRoaXMudmY9ITApfWNhdGNoKGgpe31mLnhxPSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihmLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5jb25mWyJ2aWRlby5zdHlsZSJdJiYoZi5zdHlsZT10aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0pOwppZih0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXSlmb3IodmFyIGsgaW4gdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0uaGFzT3duUHJvcGVydHkoaykmJmYuc2V0QXR0cmlidXRlKGssdGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl1ba10pO3RoaXMuU2smJnRoaXMucGxheWVyLk1lKCkmJihmLnZvbHVtZT10aGlzLnBsYXllci5NZSgpLzEwMCk7Zm9yKDtmLmZpcnN0Q2hpbGQ7KWYucmVtb3ZlQ2hpbGQoZi5maXJzdENoaWxkKTtmb3IoZD0wO2Q8YS5PLmxlbmd0aDtkKyspZi5jYW5QbGF5VHlwZShhLk9bZF0udHlwZSkmJnRoaXMuTmsoZixhLk9bZF0udXJsKyIiLGEuT1tkXS50eXBlKTt0aGlzLnZmJiZmLmxvYWQoKTtpZih0aGlzLm9pKGYpKXt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt0aGlzLlFrKGYpO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT8KYS5zdHlsZT10aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5oZWlnaHQ9IjEwMCUiKTt0aGlzLnRhPXRoaXMuaWIuYXBwZW5kQ2hpbGQoYSk7dHJ5e3RoaXMudmY/dGhpcy52aWRlbz1mOnRoaXMudmlkZW89dGhpcy50YS5hcHBlbmRDaGlsZChmKX1jYXRjaChsKXt0aGlzLnZpZGVvPWZ9fWVsc2UgdGhpcy5iLnZsKCk/KGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLHRoaXMudGE9dGhpcy5pYi5hcHBlbmRDaGlsZChhKSx0aGlzLnZpZGVvPXRoaXMudGEuYXBwZW5kQ2hpbGQoZiksdGhpcy5vbygpKTp0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxvbzpmdW5jdGlvbigpe3RoaXMuYmc9ITA7CnRoaXMuQWI9dGhpcy51Yz0hMTt0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5BYj0hMCk7ZS5DZSgpO3RoaXMuYiYmdGhpcy5iLm9yaWdpbiYmdGhpcy5iLm9yaWdpbi5vYSYmZS5Sayh0aGlzLmIub3JpZ2luLm9hKTt0aGlzLmhpKCJzZXR1cCIsdGhpcy5ZYSgpKTt2YXIgYT10aGlzLmEuQjt0aGlzLmEuQj1ELnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5hLkIsYSk7dGhpcy5hLlFoKCk7dGhpcy5hLklmKCk7Zm9yKGE9dGhpcy5hLkk7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYS5JZigpO3RoaXMuaWI9dGhpcy5hLkk7dGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSYmZS5HZih0aGlzLmliLHRoaXMuY29uZlsiY29udGFpbmVyLnN0eWxlIl0pO3RoaXMudGE9dGhpcy5hLkk7dGhpcy56aSgidnBhaWQiKTsKaWYodGhpcy5BYil7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSlhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uO3RoaXMudHJhY2soIm11dGUiLCEwKTt0aGlzLlNiKCJtdXRlZCIsImNvbnRlbnQiKTtlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfXRoaXMuRj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJoZWlnaHQiLCIxMDAlIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwibm8iKTt0aGlzLkYuc2V0QXR0cmlidXRlKCJhbGxvdyIsImF1dG9wbGF5Iik7dGhpcy5GLnNldEF0dHJpYnV0ZSgiZGVsZWdhdGVzdGlja3l1c2VyYWN0aXZhdGlvbiIsIm1lZGlhIik7dGhpcy5GLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO3RoaXMuYS5JLmFwcGVuZENoaWxkKHRoaXMuRik7CnRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSYmZS5HZih0aGlzLkYsdGhpcy5jb25mWyJ2cGFpZElmcmFtZS5zdHlsZSJdKTt0aGlzLkYub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5hLmMua2EmJnRoaXMuYS5jLmthKCkmJihhPSEwKTt2YXIgYj10aGlzLmIubG0oKSxjPXRoaXMuYi5zLk9yaWdpbmFsQWRQYXJhbWV0ZXJzO2lmKGImJmIudXJsJiYwPD1iLnVybC5pbmRleE9mKCJ3ZWxlY3QuanMiKSYmdGhpcy5BKXt2YXIgaD10aGlzLkEuZ2V0Q29uZmlnKCk7aCYmaC5hZEZhbGxiYWNrQ29uZmlnJiZoLmFkRmFsbGJhY2tDb25maWcud2VsZWN0YWxpYXMmJihjPUpTT04uc3RyaW5naWZ5KGguYWRGYWxsYmFja0NvbmZpZykpfXZhciBrPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLAphZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5sYSh0aGlzLkYsImNvbmZpZyIsayk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsCiJjb25maWciLGspfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuRiwiY29uZmlnIixrKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkYsImNvbmZpZyIsayl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5GLCJjb25maWciLGspfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLnllKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5BKTt0aGlzLkYuc3JjPWE7ZS53ZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMudWEmJiF0aGlzLlZkJiZ0aGlzLmEuYy51YSgpJiZlLm8oay5HYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEubGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMuemM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5qcChhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLmtwKCksdGhpcy5hLmxjKCEwKSwhdGhpcy5aYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5aYj17ZWw6dGhpcy5GLApjYjpmdW5jdGlvbigpe3RoaXMuY2U9ITA7ZS5vKGsuRGksdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuWmUodGhpcy5aYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmxjKCEwKSx0aGlzLm9wKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5sYyghMCksdGhpcy5zcCgpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5xcCgpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5ycCgpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnRwKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnBwKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLkVpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5xYik7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkEuRGN8fHRoaXMuY2QpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goZCl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMubnAoKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLnNlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMubHAoKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5jZCYmKHRoaXMuY2c9ITEsdGhpcy5yYygpKSx0aGlzLm1wKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMuQWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLlNiKCJtdXRlZCIsInVzZXIiKSxlLm8oay5KZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKToodGhpcy5BYj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuU2IoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuVGYsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksZS5vKGsuc2UsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnUoKSkpfX0uYmluZCh0aGlzKSk7ZS53ZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5RYSgpfS5iaW5kKHRoaXMpKTtlLndlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUWEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLnhnKGZ1bmN0aW9uKGEpe2UubGEodGhpcy5GLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sbHA6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnVjPSEwfSxtcDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmxkLHRoaXMuYi5zLAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudWM9ITF9LG9wOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsudGcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sbnA6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuc2csdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0sa3A6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5paSgpO2UubyhrLm9nLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHNwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlhhKCJzdGFydCIpO2UubyhrLmxkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSl9LHFwOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuQ2Q9ITA7dGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLmxnLAp0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSxycDpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5YYSgibWlkcG9pbnQiKTtlLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpfSx0cDpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlhhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKX0scHA6ZnVuY3Rpb24oKXt0aGlzLlhmKCk7dGhpcy5YYSgiY29tcGxldGUiKX0sRWk6ZnVuY3Rpb24oYSl7aWYodGhpcy5GJiZ0aGlzLkYucGFyZW50Tm9kZSYmdGhpcy5GLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5XYSgidnBhaWRzdG9wcGVkIik7dmFyIGY9dGhpcy5GLnBhcmVudE5vZGU7dGhpcy5GLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5GKTtmLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZik7CmUuQ2UoKTt0aGlzLkY9ITE7dGhpcy5RYShhKX19LGpwOmZ1bmN0aW9uKGEpe3ZhciBmPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWYmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGY9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGYubWF0Y2goZCkpO3RoaXMuV2EoInZwYWlkZXJyb3IiKTtlLm8oay51cCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuRWkoITApfSxOazpmdW5jdGlvbihhLGYpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkNhJiZiLmlzRW5hYmxlZCYmIWIuUGMoKSl7dmFyIGQ9Yi5hYShhKTtyZXR1cm4gZC5wcm90b2NvbCsiOi8vIitkLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Yy5zcmM9ZChmLHRoaXMuQSk7Yy5vbmVycm9yPXRoaXMuZ3AuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGMpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoZix0aGlzLkEpKX0sb2k6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LFFrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLkJpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuWmYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sUGQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuQmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5aZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLkNpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuWGYuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5ZZi5iaW5kKHRoaXMpKX0sQmk6ZnVuY3Rpb24oYSl7dGhpcy5pY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmljfHx0aGlzLlpmKGEpfS5iaW5kKHRoaXMpLHRoaXMuWWspKX0sWmY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMucWQmJnRoaXMub2kodGhpcy52aWRlbykmJiF0aGlzLk9iJiYhdGhpcy5pYyl7dGhpcy5xZD0hMDt0cnl7aWYoIWUuRGEoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuT2J8fCh0aGlzLk9iPSEwLHRoaXMuUGQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5ZYSgpLCEwKSx0aGlzLkEuUmd8fHRoaXMuQS5zYSgidmlkZW8tbm9vcCIpKTt0aGlzLlFhKCk7cmV0dXJufX1jYXRjaChmKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5ZYSgpLCEwKX10aGlzLmVwKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEuSWYoKTt0aGlzLmNwKCk7dGhpcy56aSgpO3RoaXMuQWcoKTt0aGlzLmEuUWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuTWYoKX19LE1mOmZ1bmN0aW9uKCl7dGhpcy54ZHx8dGhpcy5tZygpfSxtZzpmdW5jdGlvbihhKXt2YXIgZj10aGlzLnZpZGVvLnBsYXkoKTtpZihmJiZmWyJjYXRjaCJdKWZbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLnhkfHwoYT90aGlzLlFhKCk6KHRoaXMubGYoITApLHRoaXMubWcoITApKSl9LmJpbmQodGhpcykpO2NhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5xYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYy5iaW5kKHRoaXMpKSk6Sj1mdW5jdGlvbigpe3RoaXMudWV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLk1mKCkpfS5iaW5kKHRoaXMpO3RoaXMuT2UoKS5maSh0aGlzKX0sWGY6ZnVuY3Rpb24oKXt0aGlzLkEuYWImJiF0aGlzLk9iJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuWGEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7dGhpcy5FZT0hMDtlLm8oay5Iayx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuUWEoKX0sS2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBmPVtdLGQ9ITEsYz0wO2M8YS5sZW5ndGg7YysrKWQ9ZS5naChhW2NdKSxmLnB1c2goZCk7YT17aGFzaGVzOmZ9O2E9ay5TYShhLHRoaXMudSgpKTtlLnVvKGEpfSxRYTpmdW5jdGlvbihhKXt0aGlzLmImJnRoaXMuYi5lZSYmdGhpcy5Layh0aGlzLmIuZWUpOwppZighdGhpcy5GZSlpZih0aGlzLkZlPSEwLHRoaXMuY2V8fChlLm8oay5sbix0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMudHJhY2soIm5vdHZpZXdhYmxlIikpLHRoaXMuYi5DYnx8dGhpcy5iLnhjKXtlLnViKCJuZXdTbWFsbEFkSWQiKTt0aGlzLkxmKys7dGhpcy5pYz10aGlzLnFkPSExO3RyeXt0aGlzLlBkKHRoaXMudmlkZW8pfWNhdGNoKGYpe310cnl7dGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKX1jYXRjaChkKXt9dHJ5e3RoaXMuaWIucmVtb3ZlQ2hpbGQodGhpcy50YSl9Y2F0Y2goYyl7fXRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGw7dGhpcy5UZD0hMTt0cnl7dGhpcy5hLnhpKCl9Y2F0Y2goaCl7fXRoaXMuVmQ9ITA7dGhpcy5hLlNlKCk7dGhpcy5uYz0hMTt0aGlzLk9lKCkuJGgoKTt0aGlzLmIuQ2ImJnRoaXMuYi5vcmlnaW4ubWYoKTt0aGlzLmIueGMmJihhP3RoaXMuYi5vcmlnaW4uSmgoKTp0aGlzLndkKCkpfWVsc2UgdGhpcy53ZCgpfSwKZ3A6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7dGhpcy52aWRlby5uZXR3b3JrU3RhdGUmJnRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiYodGhpcy5QZCh0aGlzLnZpZGVvKSx0aGlzLllmKGEpKX0sWWY6ZnVuY3Rpb24oYSl7dGhpcy5pYz0hMDthJiZhLnRhcmdldCYmYS50YXJnZXQuZXJyb3ImJmEudGFyZ2V0LmVycm9yLmNvZGV8fHRoaXMudmlkZW8ubmV0d29ya1N0YXRlPT10aGlzLnZpZGVvLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLkEua2woKTt0aGlzLmIub3JpZ2luLlRnKHYuaWUpfSxDaTpmdW5jdGlvbigpe2lmKHRoaXMuUG8pdGhpcy5RYSgpO2Vsc2V7dGhpcy5uYz0hMDt0aGlzLmEuYy51YSYmIXRoaXMuVmQmJnRoaXMuYS5jLnVhKCkmJmUubyhrLkdjLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5UbyhhKTtpZighdGhpcy5aYil7dmFyIGY9MkUzLGQ9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmKHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCYmKGQ9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50KSx0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUyYmKGY9dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMpKTt0aGlzLlpiPXtlbDp0aGlzLnZpZGVvLGNiOmZ1bmN0aW9uKCl7dGhpcy5jZT0hMDtlLm8oay5EaSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soInZpZXdhYmxlIil9LmJpbmQodGhpcyksdGltZU1TOmYscGVyY2VudDpkLHN0YXJ0VGltZTohMX07ZS5aZSh0aGlzLlpiKX1kPSIiO3RoaXMuYi5LZiYmKGY9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5naSkpJiYoZD10aGlzLmIuS2YtYSwwPGQ/ZD10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIiwKZCk6KGQ9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixkKSx0aGlzLlRkfHwodGhpcy5UZD0hMCxmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe3RoaXMudHJhY2soInNraXAiKTtlLm8oay5zZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMuYi5DYj8odGhpcy5pYz10aGlzLnFkPSExLHRoaXMuUGQodGhpcy52aWRlbyksdGhpcy50YS5yZW1vdmVDaGlsZCh0aGlzLnZpZGVvKSx0aGlzLmliLnJlbW92ZUNoaWxkKHRoaXMudGEpLHRoaXMuY2FwdGlvbj10aGlzLmNvbnRyb2xzPW51bGwsdGhpcy5UZD0hMSx0aGlzLmEueGkoKSx0aGlzLmIub3JpZ2luLm1mKCkpOnRoaXMuUWEoKX0uYmluZCh0aGlzKSkpKSxmLmlubmVySFRNTD1kKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMubmQucmVwbGFjZSgiW3RpbWVdIixlLmFoKHRoaXMuYi5kdXJhdGlvbi1hKSkpO3RoaXMudWU9ITA7CnRoaXMudmlkZW8uY29udHJvbHM9ITF9fSx1aTpmdW5jdGlvbigpe3RoaXMuUGh8fCh0aGlzLlBoPSEwLHRoaXMuQ2R8fGUudHJhY2soInN0YXRzX2hkX2Nsb3NlZEJlZm9yZTFzdFF1YXJ0aWxlIiwiIiwhMCkpfSxUbzpmdW5jdGlvbihhKXtlLm8oay5zZSx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO2E9PXRoaXMudml8fHRoaXMuT2J8fCgwPT1hJiYodGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy50cmFjaygiaW1wcmVzc2lvbiIpLHRoaXMuQS5GYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2ltcHJlc3Npb24iLHRoaXMuRmIsITApLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy51aSgpfS5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixmdW5jdGlvbigpe3RoaXMudWkoKX0uYmluZCh0aGlzKSksdGhpcy5PYnx8CnRoaXMuaWkoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuQS5hYiYmdGhpcy5YYSgic3RhcnQiKSxlLm8oay5vZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLGUubyhrLnRnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgiZmlyc3RRdWFydGlsZSIpLHRoaXMuQ2Q9ITApLHRoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKSxlLm8oay5sZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi8yKSYmKHRoaXMuQS5hYiYmKGUudHJhY2soInF1YXJ0aWxlIiwibWlkcG9pbnQiLCEwKSx0aGlzLlhhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLAplLm8oay5xZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5iLmR1cmF0aW9uLzQpJiYodGhpcy5BLmFiJiYoZS50cmFjaygicXVhcnRpbGUiLCJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy5YYSgidGhpcmRRdWFydGlsZSIpKSx0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIiksZS5vKGsudWcsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSksdGhpcy52aT1hKX0saGk6ZnVuY3Rpb24oYSxmKXtlLnRyYWNrKCJzdGF0c19oZF9hZF8iK2EsZiwhMCl9LHdvOmZ1bmN0aW9uKCl7ZS5iZChbInN0YXRzX2hkX2FkX2NhbGw6Iit0aGlzLllhKCksInN0YXRzX2hkX2FkX2NhbGxfc3VtIl0pfSxpaTpmdW5jdGlvbigpe2UuYmQoWyJzdGF0c19oZF9hZF9pbXByZXNzaW9uOiIrdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX3N1bSJdKX0seG86ZnVuY3Rpb24oKXtlLmJkKFsic3RhdHNfaGRfYWRfZW1wdHk6IisKdGhpcy5ZYSgpLCJzdGF0c19oZF9hZF9lbXB0eV9zdW0iXSl9LFdhOmZ1bmN0aW9uKGEpe2UuYmQoWyJzdGF0c19oZF9hZF9lcnJvcjoiK2EsInN0YXRzX2hkX2FkX2Vycm9yX3N1bSJdKX0sWGE6ZnVuY3Rpb24oYSl7KHRoaXMuYmd8fHRoaXMuQS5hYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLllhKCksITApfSxTYjpmdW5jdGlvbihhLGYpe3RoaXMuQS5hYiYmZS50cmFjaygic3RhdHNfaGRfIithLGYsITApfSx0cmFjazpmdW5jdGlvbihhLGYpe2lmKCF0aGlzLk9iKXt0aGlzLm5mJiZ0aGlzLm5mLnRyYWNrJiZ0aGlzLm5mLnRyYWNrKGEpOyJpbXByZXNzaW9uIj09YSYmZS5HZSYmZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsImltcHJlc3Npb24iLCEwKTtpZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09CiEwfXZhciBkPVtdO3RyeXtkPXRoaXMuam0odGhpcy5iLk9hLGEpfWNhdGNoKGMpe2Q9W119Zm9yKDtkLmxlbmd0aDspdHJ5e3ZhciBoPWQucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5FYz0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLlVkLmltcHJlc3Npb25zJiZlLkZtKGgudXJsLHRoaXMuVWQuaW1wcmVzc2lvbnMpP3RoaXMuZWYoaC51cmwsaC50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpO2UubyhrLklrLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx7YWRJZDp0aGlzLlVkLmFkSWQsaW1wcmVzc2lvblVSTDpifSx0aGlzLnUoKSl9Y2F0Y2goZCl7fX0uYmluZCh0aGlzKSk6dGhpcy5lZihoLnVybCxoLnR5cGUpfWNhdGNoKGwpe31pZighZil0cnl7dGhpcy5iLk9hPXRoaXMuQ2wodGhpcy5iLk9hLGEpfWNhdGNoKEIpe319fSxZYTpmdW5jdGlvbigpe3ZhciBhPWUuRGEoKT8ibW9iaWxlIjoiZGVmYXVsdCIsCmY9IiI7dGhpcy5iZyYmKGY9Il92cGFpZCIpO3RoaXMuY2QmJihmPSJfd2VsZWN0Iik7cmV0dXJuIGErZn0sZWY6ZnVuY3Rpb24oYSxmLGQsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoZj10aGlzLkEud2EoYSksZCYmZi5NayhkKSxjfHwoYz10aGlzLlFnKSxlfHwoZT10aGlzLlFnKSx0aGlzLk9rKGEpLHRoaXMuQS5LYShmLGZ1bmN0aW9uKCl7dGhpcy5aaChhKTtjKCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLlpoKGEpO2UoKX0uYmluZCh0aGlzKSwhMSwhMCkpfSxPazpmdW5jdGlvbihhKXt0aGlzLm9jW2FdPSJvcGVuIn0sWmg6ZnVuY3Rpb24oYSl7dGhpcy5vY1thXT0iY2xvc2VkIn0sc2w6ZnVuY3Rpb24oKXt0aGlzLm9jPXt9fSx6bzpmdW5jdGlvbigpe3ZhciBhPTAsZjtmb3IoZiBpbiB0aGlzLm9jKXRoaXMub2MuaGFzT3duUHJvcGVydHkoZikmJiJvcGVuIj09dGhpcy5vY1tmXSYmYSsrO3JldHVybiBhfSxqbTpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT0KZn0pfSxDbDpmdW5jdGlvbihhLGYpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Zn0pfSxlcDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuYS5jO2Eud2cmJmEud2codGhpcy5BaS5iaW5kKHRoaXMpKTt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLkFpLmJpbmQodGhpcykpfSxBaTpmdW5jdGlvbigpe2lmKGUuRGEoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5KXRoaXMucmMoKTtlbHNlIGlmKHRoaXMuYi5xYil7dHJ5e3ZhciBhPShuZXcgRGF0ZSkuZ2V0VGltZSgpO3RoaXMuYi5EZXx8KHRoaXMuYi5EZT0xKTtpZigxMDA+YS10aGlzLmIuRGUpcmV0dXJuO3RoaXMuYi5EZT1hfWNhdGNoKGYpe31lLm8oay5KZyx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQoiX3RvcCI7aWYodGhpcy5BLkRjfHx0aGlzLmNkKWE9Il9ibGFuayI7dHJ5e3ZhciBiPXdpbmRvdy5vcGVuKCIiLGEpO2IuZG9jdW1lbnQuYm9keS5pbm5lckhUTUw9IjxkaXY+PC9kaXY+IjtiLmRvY3VtZW50LmxvY2F0aW9uLmhyZWY9dGhpcy5iLnFifWNhdGNoKGYpe2E9d2luZG93Lm9wZW4odGhpcy5iLnFiLGEpO3RyeXthfHx3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmIucWIsIl90b3AiKX19fS5iaW5kKHRoaXMpLDUwMCl9fSxjcDpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsCmEuc3R5bGUucGFkZGluZz0iMnB4IixhLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixhLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5uZC5yZXBsYWNlKCJbdGltZV0iLGUuYWgoMCkpO3ZhciBmPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuQS5zZCYmKGY9dGhpcy5BLnNkKTtmJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLkhiLmJpbmQodGhpcyksMUUzKmYpO3RoaXMuY2FwdGlvbj10aGlzLnRhLmFwcGVuZENoaWxkKGEpfX0sSGI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuQS5zZCkmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sClJkOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHx0aGlzLkEuc2QpJiZ0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSx6aTpmdW5jdGlvbihhKXtpZighZS5OZih0aGlzLmNvbnRyb2xzKSl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtkLmlkPXRoaXMuemw7dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Quc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihkLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZC5zdHlsZS53aWR0aD0iMTAwJSIsZC5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsZC5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsZC5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsZC5zdHlsZS5ib3R0b209IjBweCIsZC5zdHlsZS56SW5kZXg9IjEwMDAwIik7ZC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLApmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2QuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtjLmlkPXRoaXMuUGI7Yy5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucmkuYmluZCh0aGlzKSksZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5yaS5iaW5kKHRoaXMpKSk6KGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLAp0aGlzLnBpLmJpbmQodGhpcykpLGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucGkuYmluZCh0aGlzKSkpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMucmMoKTt0aGlzLlJkKCl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5JYigpO3RoaXMuSGIoKX0uYmluZCh0aGlzKSk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/aC5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooaC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxoLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaC5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGguc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7aC5pZD10aGlzLk5iO2guaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUm8uYmluZCh0aGlzKSk6aC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5Rby5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKTtoLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLmdpO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIiwKZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2QuYXBwZW5kQ2hpbGQoYyk7dGhpcy5iLktmJiZkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoaCk7ZC5zdHlsZS5kaXNwbGF5PSJub25lIjtlLkRhKCl8fCh0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLnJjKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnRhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuSWIoKTt0aGlzLkhiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMudGEuYXBwZW5kQ2hpbGQoZCk7CnRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl06KGYuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixmLnN0eWxlLndpZHRoPSIxMDAlIixmLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixmLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixmLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixmLnN0eWxlLmJvdHRvbT0iMHB4IixmLnN0eWxlLnpJbmRleD0iMTAwMDAiLGYuc3R5bGUuZGlzcGxheT0ibm9uZSIsZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxkLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGQuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKZi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy54YT10aGlzLnRhLmFwcGVuZENoaWxkKGYpO3RoaXMuYS54ZyhmdW5jdGlvbihhKXt0aGlzLnhhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmEuYy5rYSYmdGhpcy5hLmMua2EoKSYmKGUubyhrLktnLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5sZigpKTt0aGlzLkliKCl9fSxJYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LHJjOmZ1bmN0aW9uKCl7ImhpZGRlbiI9PXRoaXMuY29udHJvbHMuc3R5bGUudmlzaWJpbGl0eXx8dGhpcy54YSYmImJsb2NrIj09dGhpcy54YS5zdHlsZS5kaXNwbGF5fHx0aGlzLmNnfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxwaTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuUGIpO3RoaXMuYS5CLnBhdXNlZD8KKHRoaXMuYS5CLnBsYXkoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5CLnBhdXNlKCksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLnRyYWNrKCJwYXVzZSIsITApLGUubyhrLnFlLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpKX0scmk6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlBiKTt0aGlzLnVjPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInBsYXkiKSx0aGlzLnhhJiYodGhpcy54YS5zdHlsZS5kaXNwbGF5PSJub25lIiksYSYmKGEuaW5uZXJIVE1MPQp0aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMudWM9ITEpOihlLmxhKHRoaXMuRiwiY29udHJvbCIsInBhdXNlIiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuSWIoKSx0aGlzLkhiKCkpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbiksdGhpcy51Yz0hMCl9LExkOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkfHwodGhpcy5hLkIucGF1c2UoKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS5vKGsucWUsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LGJpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QYik7dGhpcy5hLkIucGF1c2VkJiYodGhpcy5hLkIucGxheSgpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5sZCx0aGlzLmIucyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy51KCkpKX0sUW86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZD8odGhpcy5hLkIubXV0ZWQ9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwidXNlciIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpOih0aGlzLmEuQi5tdXRlZD0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbiksdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuU2IoIm11dGVkIiwidXNlciIpLGUubyhrLkpkLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxSbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuTmIpOwp0aGlzLkFiPyhlLmxhKHRoaXMuRiwiY29udHJvbCIsInVubXV0ZSIpLHRoaXMuQWI9ITEsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5GLCJjb250cm9sIiwibXV0ZSIpLHRoaXMuQWI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sbGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLk5iKTt0aGlzLmEuQi5tdXRlZHx8KHRoaXMuYS5CLm11dGVkPSEwLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5TYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuSmQsdGhpcy5iLnMsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMudSgpKSl9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5OYik7dGhpcy5hLkIubXV0ZWQmJih0aGlzLmEuQi5tdXRlZD0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLlNiKCJ1bm11dGVkIiwiY29udGVudCIpLGUubyhrLlRmLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSkpfSxxYzpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLnFjKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5xYyk7dGhpcy54ZHx8dGhpcy51ZXx8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuTWYoKSl9LHdkOmZ1bmN0aW9uKCl7dGhpcy5PbSgpJiZ0aGlzLk5tKCkmJih0aGlzLkEud2N8fCJzcGllZ2VsLmRlIj09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKXx8IndlYi5kZSI9PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZil8fCJnbXgubmV0Ij09ZS5VYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSkmJgoicHJlcm9sbCI9PWUuTGImJnRoaXMuVW8oKXx8KHRoaXMueGQ9ITAsdGhpcy5EYiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5EYiksdGhpcy5EYj0hMSksdGhpcy5MZygpKX0sT206ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCk7aWYoIXRoaXMuQS5oYnx8ZS5EYSgpfHwhYS5pc0Nocm9tZSYmIWEuaXNGaXJlZm94fHxhLmlzRWRnZSl7dmFyIGY9dGhpcy5BLmhiPyIiOiJub3ZwYWlkIixkPWUuRGEoKT8ibW9iaWxlIjoiIjtlLnRyYWNrKCJzdGF0c193dF9wb3NzaWJsZSIsZitkKyhhLmlzQ2hyb21lfHxhLmlzRmlyZWZveD8iIjoibm9mZmNociIpKyhhLmlzRWRnZT8iZWRnZSI6IiIpLCEwKX1yZXR1cm4gdGhpcy5BLmhiJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LE5tOmZ1bmN0aW9uKCl7dmFyIGE9ITEsZj1tLmdldENvbmZpZygpOyJzdm1wcmV2aWV3IiE9ZS5hYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5hbmNob3J8fHRoaXMuVWN8fChhPQohMCxmLmFkRmFsbGJhY2tVUkx8fChmLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7KGF8fCF0aGlzLkVjJiZmLmFkRmFsbGJhY2tVUkwpJiYhdGhpcy5VY3x8ZS50cmFjaygic3RhdHNfd3RfYWxsb3dlZCIsKHRoaXMuRWM/ImFueSI6IiIpKyhmLmFkRmFsbGJhY2tVUkw/IiI6Im5vZmIiKSsodGhpcy5VYz8ib25seSI6IiIpLCEwKTtyZXR1cm4oYXx8IXRoaXMuRWMmJmYuYWRGYWxsYmFja1VSTCkmJiF0aGlzLlVjfSxabDpmdW5jdGlvbigpe3ZhciBhPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja1VSTCxmPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7YXx8InN2bXByZXZpZXciIT1mLmFuY2hvcnx8KGE9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKTtyZXR1cm4gYX0sVW86ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIpe2lmKGImJmIucmVzcG9uc2VUZXh0KXRyeXt2YXIgZj1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KTsKaWYoZi5oYXNPd25Qcm9wZXJ0eSgiYXZhaWxhYmxlIikmJmYuYXZhaWxhYmxlKXtlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5ZYSgpLCEwKTt2YXIgYz1lLnllKGQsdGhpcy5BLCExLHtvbmx5VVJMOiEwfSk7aWYoYylyZXR1cm4gdGhpcy5mZihjLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pLCEwfX1jYXRjaChoKXt9dGhpcy53ZCgpfXZhciBmPW0uZ2V0Q29uZmlnKCkuYWRGYWxsYmFja0NvbmZpZy53ZWxlY3RhbGlhcyxkPXRoaXMuWmwoKTt0aGlzLkVjPXRoaXMuVWM9dGhpcy5jZD10aGlzLmNnPSEwO3JldHVybiBmPyhlLmJiKCJodHRwczovL3d3dy53ZWxlY3QuZGUvYXBpL3YxL3ByZWZsaWdodC9ieV9hbGlhcy8iK2YsImRld2VsZWN0d3d3d2VsZWN0ZGUiLHt9LGEuYmluZCh0aGlzKSxhLmJpbmQodGhpcyksdGhpcy5BKSwhMCk6ITF9LExnOmZ1bmN0aW9uKGEpe3RoaXMuem8oKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkxnKCEwKX0uYmluZCh0aGlzKSwKdGhpcy50bik6KHRoaXMuVmQ9ITAsdGhpcy5hLlNlKCksdGhpcy5hLlluKCksdGhpcy5uYz0hMSxhPXRoaXMuYi5zfHx7fSx0aGlzLkVlfHwoYS5ub0NvbXBsZXRlUXVhcnRpbGU9ITApLGUubyhrLnlsLHRoaXMuYi5zLHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnUoKSksdGhpcy5PZSgpLiRoKCkpfSxPZTpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5hJiZ0aGlzLmEuYyYmKGE9dGhpcy5hLmMpO3JldHVybiBhfSxBZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSmEoIm1pblZpcyIpO2EmJihlLlllKHRoaXMudmlkZW8sYSk/dGhpcy5iaSgpOnRoaXMuTGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5xYixhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi5DYix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYKKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy56YyYmMDx0aGlzLnpjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy56YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSx1OmZ1bmN0aW9uKCl7dmFyIGE9e307YS5hZHNlc3Npb25faWQ9dGhpcy5hbCsiLSIrdGhpcy5MZjt0aGlzLmImJnRoaXMuYi5oaCYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmIuaGgoKSk7cmV0dXJuIGF9LFFnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5vanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmxrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUmE9Yy5sa3x8UmE7bmV3IFJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYixkLGMpe3RoaXMub3B0aW9ucz1jfHx7fTtmPWQ7dGhpcy5wYXJlbnQ9YTt0aGlzLnVybD1iO3RoaXMubmE9bnVsbDt0aGlzLlg9W107dGhpcy5MPW51bGw7dGhpcy55Yz10aGlzLkFjPSExO3RoaXMub2E9IiI7dGhpcy5hZz0hMTt0aGlzLnNoPSIiO2MmJmMuZW1wdHk/dGhpcy5XbSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYj0wLGYsZD1bXTtjLnFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLkFkKCksYjtiPWUuYWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGQ9IiI7Yi5xdWVyeUtleSYmKGQ9Yi5xdWVyeUtleS5odnApO2QmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEModGhpcy51cmwpOm0ud2EobS5XZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTsKdmFyIGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcHRpb25zLnZwYWlkJiYhZS5EYSgpJiYoYS5pc0Nocm9tZXx8YS5pc0ZpcmVmb3gpJiYhYS5pc0VkZ2V9LmJpbmQodGhpcyksZj1mdW5jdGlvbigpe3JldHVybiBjKCkmJihlLkQoIm1hcnRoYXN0ZXdhcnQuY29tIil8fGUuRCgiZmFuZG9tLmNvbSIpfHxlLkQoImdpZ2EuZGUiKXx8ZS5EKCJraW5vLmRlIil8fGUuRCgic3BpZWxldGlwcHMuZGUiKXx8ZS5EKCJkZXNpcmVkLmRlIikpfS5iaW5kKHRoaXMpO2lmKGMoKXx8ZigpKXt2YXIgaD1lLk5nKHRoaXMudXJsKTtofHwoaD10aGlzLnVybCk7dmFyIGY9ZnVuY3Rpb24oKXtyZXR1cm4gMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW19LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybiAwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYKMDxoLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKX0uYmluZCh0aGlzKSxsPWZ1bmN0aW9uKCl7cmV0dXJuKGUuRCgiZ2lnYS5kZSIpfHxlLkQoImtpbm8uZGUiKXx8ZS5EKCJzcGllbGV0aXBwcy5kZSIpfHxlLkQoImRlc2lyZWQuZGUiKSkmJjA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKX0uYmluZCh0aGlzKSxuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT1oLmluZGV4T2YoImh0dHBzOi8vcHViYWRzLmcuZG91YmxlY2xpY2submV0L2dhbXBhZC9hZHMiKXx8MDxoLmluZGV4T2YoImdvb2dsZWFkcy5nLmRvdWJsZWNsaWNrLm5ldC9wYWdlYWQvYWRzIil9LmJpbmQodGhpcyk7aWYoZigpfHxrKCl8fGwoKXx8ImFwcHNwb3QiPT1kKW4oKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChtLldkKGgpKSsiJnR5cGU9anMiLGI9bS53YShtLldkKHRoaXMudXJsKSwKITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKSxiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iY29tYXBwc3BvdGltYTN2cGFpZCIsZS50cmFjaygic3RhdHNfaGRfYWR4IiwiIiwhMCkpOmI9bS53YShtLldkKGgpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlcik7Yi5kYXRhLmhvbWFkX3ZwYWlkX2NvbXBhdGlibGU9InRydWUiO3RoaXMub3B0aW9ucy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGIuZGF0YS5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncz0iTWVkaWFmaWxlIil9bS5LYShiLHRoaXMuVm0uYmluZCh0aGlzKSx0aGlzLlNtLmJpbmQodGhpcykpfSxkaDpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5uYS5maXJzdENoaWxkLm5vZGVOYW1lJiYKYS5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigxPT1hLmNoaWxkTm9kZXMubGVuZ3RoKWlmKGEucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT1lLkxiKXRyeXt2YXIgYz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtkW2JdPWMuZmlyc3RDaGlsZH1jYXRjaChmKXtkW2JdPXt9fWVsc2UgZC5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5uYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMubmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBkPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLApiLGMpe2lmKCJzdGFydCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwcmVyb2xsIj09ZS5MYnx8ImVuZCI9PWEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikmJiJwb3N0cm9sbCI9PWUuTGJ8fHRoaXMuTG0oYS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSl8fG0uRW8oKSl0cnl7dmFyIGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PWYubGVuZ3RoJiYoZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFRhZ1VSSSIpKTt2YXIgZz0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZygnPEFkIHNlcXVlbmNlPSInKyhiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytmWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZDtkLnB1c2goZyl9Y2F0Y2goaCl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSwKYj0wO2I8YS5sZW5ndGg7YisrKWQucHVzaChhW2JdKX19LmJpbmQodGhpcykpO2E9YS5jb25jYXQoZCk7cmV0dXJuIGE9YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOjB9KX0sTG06ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5vcHRpb25zLmNvbnRlbnRWaWRlbyxkPXRoaXMub3B0aW9ucy50aW1lT2Zmc2V0RGVsdGF8fDEwLGM9MDtpZighKGEmJmImJmIuZHVyYXRpb24mJmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2M9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksYz1wYXJzZUludChhWzBdKSsKNjAqcGFyc2VJbnQoYVsxXSkrMzYwMCpwYXJzZUludChhWzJdKSk7cmV0dXJuIGMmJk1hdGguYWJzKGMtcGFyc2VJbnQoYi5jdXJyZW50VGltZSkpPD1kPyEwOiExfSxWbTpmdW5jdGlvbihhKXt0aGlzLkduKGEpO3RyeXt0aGlzLm5hPWEucmVzcG9uc2VYTUwsdGhpcy5uYXx8KHRoaXMubmE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLnNoPWEudXJsQ2FsbGVkO2lmKHRoaXMuWC5sZW5ndGgpdGhpcy5UYygpO2Vsc2V7dGhpcy5yYSh0aGlzLlJhKHYuZWQse2Vycm9yOnRoaXMuYWc/Ri5sZTpGLmZnfSkpO3RyeXtlLnRyYWNrKCJzdGF0c19oZF9tdHl1cmwiLGUuVWEodGhpcy5vYSksITApfWNhdGNoKGQpe319fSxXbTpmdW5jdGlvbihhKXt0cnl7dGhpcy5uYXx8Cih0aGlzLm5hPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMucmEodGhpcy5SYSh2Lm1lKSl9dGhpcy5YPXRoaXMuZGgoKTt0aGlzLkFjPXRoaXMuUWYoKTt0aGlzLnljPXRoaXMubWkoKTt0aGlzLlgubGVuZ3RoP3RoaXMuVGMoKTp0aGlzLnJhKHRoaXMuUmEodi5lZCx7ZXJyb3I6dGhpcy5hZz9GLmxlOkYuZmd9KSl9LFNtOmZ1bmN0aW9uKCl7dGhpcy5yYSh0aGlzLlJhKHYuZWcse2RlcHRoOmJ9KSl9LFRjOmZ1bmN0aW9uKCl7dGhpcy5MPXRoaXMuWC5zaGlmdCgpO3RoaXMuUG0oKT90aGlzLk1vKCk/KGIrKyxuZXcgYSh0aGlzLHRoaXMubWgoKSxmLHtBZFN5c3RlbTp0aGlzLlJsKCksdnBhaWQ6dGhpcy5vcHRpb25zLnZwYWlkfSkpOnRoaXMucmEodGhpcy5SYSh2LmhnKSk6KGI9MCx0aGlzLldvKCkmJnRoaXMucmYodGhpcy5CbCgpKSl9LG1mOmZ1bmN0aW9uKCl7dGhpcy5BYz8odGhpcy5BYz0xPHRoaXMuWC5sZW5ndGgsCnRoaXMuWC5sZW5ndGgmJnRoaXMuVGMoKSk6dGhpcy5wYXJlbnQubWYoKX0sSmg6ZnVuY3Rpb24oKXt0aGlzLnljPyh0aGlzLnljPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLlRjKCkpOnRoaXMucGFyZW50LkpoKCl9LFdvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSm8oKT90aGlzLklvKCk/ITA6KC0xIT10aGlzLktjKCk/dGhpcy5yYSh0aGlzLlJhKHYuZmUpKTp0aGlzLnJhKHRoaXMuUmEodi5kZykpLCExKToodGhpcy5yYSh0aGlzLlJhKHYuZWQsRi5nZykpLCExKX0scmY6ZnVuY3Rpb24oYSl7dGhpcy5vYXx8KHRoaXMub2E9IiIpO2EuZWV8fChhLmVlPVtdKTthLmVlLnB1c2godGhpcy5zaCk7YS5PYT1hLk9hLmNvbmNhdCh0aGlzLmhmKCkpO2EuQ2I9YS5DYj9hLkNiOnRoaXMuQWM7YS54Yz1hLnhjP2EueGM6dGhpcy55YzthLlphPWEuWmE/YS5aYTotMSE9dGhpcy5vYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuWmc7dGhpcy5wYXJlbnQucmYoYSl9LApCbDpmdW5jdGlvbigpe3ZhciBhPW5ldyBTYTt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5kdXJhdGlvbj10aGlzLktjKCk7YS5PPXRoaXMuamgoKTthLnFiPXRoaXMuVWwoKTthLkVxPVtdO2Eub3JpZ2luPXRoaXM7YS5zPXRoaXMuUWwoKTthLktmPXRoaXMuaG0oYS5kdXJhdGlvbik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO3JldHVybiBhfSxyYTpmdW5jdGlvbihhKXt0aGlzLm9hfHwodGhpcy5vYT0iIik7YS5aYT1hLlphP2EuWmE6LTEhPXRoaXMub2EuaW5kZXhPZigic21hcnRjbGlwLm5ldCIpJiYhdGhpcy5vcHRpb25zLlpnO2lmKCF0aGlzLkwmJnRoaXMubmEmJnRoaXMubmEuaGFzQ2hpbGROb2RlcygpKXt0aGlzLkw9dGhpcy5uYTt0cnl7aWYodGhpcy5MJiZ0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUpe3ZhciBkPSExOyhkPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRXJyb3IiKSkmJgpkLmxlbmd0aCYmZS50cmFjaygic3RhdHNfaGRfZW1wdHlBZEVycm9yU3dpdGNoIiwiIiwhMCl9fWNhdGNoKGMpe319dGhpcy5MJiYoYS5PYT1hLmVycm9yLmNvZGUhPXYuZmUuY29kZT9hLk9hLmNvbmNhdCh0aGlzLlZsKCkpOmEuT2EuY29uY2F0KHRoaXMuZG0oKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5qYyYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmpjJiZ0aGlzLnBhcmVudC5qYyhhKSxiPTAsdGhpcy5UYygpKToodGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LnJhJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wYXJlbnQucmEmJnRoaXMucGFyZW50LnJhKGEpLGI9MCl9LGpjOmZ1bmN0aW9uKGEpe3RoaXMucGFyZW50LmpjKGEpfSxUZzpmdW5jdGlvbihhLGIpe3RoaXMucmEodGhpcy5SYShhLGIpKX0sUmE6ZnVuY3Rpb24oYSxiKXt2YXIgZD1uZXcgVGEoYSxiKTtkLm9yaWdpbj10aGlzO3JldHVybiBkfSxNbzpmdW5jdGlvbigpe3JldHVybiBiPApmfSxKbzpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuamgoKS5sZW5ndGh9LElvOmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5LYygpfSxRZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7cmV0dXJuIGJ9KS5sZW5ndGh9LG1pOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5YJiYyPD10aGlzLlgubGVuZ3RoJiYhdGhpcy5RZigpJiYoYT0hMCk7cmV0dXJuIGF9LEduOmZ1bmN0aW9uKGEpe3RoaXMub2E9IlVOS05PV04iO3RyeXtkLnB1c2godGhpcy5vYT1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpKX1jYXRjaChiKXt0aGlzLm9hPSJVTktOT1dOIn10cnl7dGhpcy5hZz1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxQbTpmdW5jdGlvbigpe3JldHVybiAwPAp0aGlzLm1oKCkubGVuZ3RofSxtaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5lKHRoaXMuTCwiVkFTVEFkVGFnVVJJIil9LFJsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTmUodGhpcy5MLCJBZFN5c3RlbSIpfSxoZjpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLGI9W10sZD0wO2Q8YS5sZW5ndGg7ZCsrKXt2YXIgYz1hW2RdO1tdLnNsaWNlLmNhbGwodGhpcy5MLmdldEVsZW1lbnRzQnlUYWdOYW1lKGMpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3RyeXtpZigiVHJhY2tpbmciPT1jJiZhJiZhLnBhcmVudE5vZGUmJiJUcmFja2luZ0V2ZW50cyI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSYmKGEucGFyZW50Tm9kZS5wYXJlbnROb2RlJiYiTm9uTGluZWFyQWRzIj09YS5wYXJlbnROb2RlLnBhcmVudE5vZGUubm9kZU5hbWV8fAphLnBhcmVudE5vZGUucGFyZW50Tm9kZSYmIkNvbXBhbmlvbiI9PWEucGFyZW50Tm9kZS5wYXJlbnROb2RlLm5vZGVOYW1lKSlyZXR1cm59Y2F0Y2goZCl7fWlmKGEmJiF0aGlzLnpoKGEpKXt2YXIgZj1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Yy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpmLHVybDp0aGlzLnNiKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0semg6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/IkNvbXBhbmlvbiI9PWEubm9kZU5hbWU/ITA6dGhpcy56aChhLnBhcmVudE5vZGUpOiExfSxkbTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iaW1wcmVzc2lvbiI9PWEudHlwZX0pfSxWbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaGYoKTtyZXR1cm4gYT1hLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZXJyb3IiPT1hLnR5cGV9KX0sVWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zYih0aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNsaWNrVGhyb3VnaCIpWzBdKX0sCmpoOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspYi5wdXNoKHtpZDphW2RdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbZF0uZ2V0QXR0cmlidXRlKCJ0eXBlIiksUGE6YVtkXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2RdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtkXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLFpwOmFbZF0uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnNiKGFbZF0pfSk7dmFyIGM9dGhpcy5vcHRpb25zLlBhfHwxRTM7dHJ5e3ZhciBmPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGU9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTE9PWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSwKYil7cmV0dXJuIE1hdGguYWJzKGMtYS5QYSktTWF0aC5hYnMoYy1iLlBhKX0pLGI9Zi5jb25jYXQoZSl9Y2F0Y2goaCl7fXJldHVybiBifSxRbDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRQYXJhbWV0ZXJzIikpO2Zvcih2YXIgYj0iIixkPSExLGM9W10sYj0hMSxmPSIiLGU9W10saD0iIixoPTA7aDxhLmxlbmd0aDtoKyspe2Y9Yj10aGlzLkZkKGFbaF0pO3RyeXtkPUpTT04ucGFyc2UoYil9Y2F0Y2goayl7ZD1ifWMucHVzaChkKTtlLnB1c2goZil9MTxhLmxlbmd0aD8oYj1jLGg9Zik6KGI9ZCxoPWUpO3JldHVybntBZFBhcmFtZXRlcnM6YixPcmlnaW5hbEFkUGFyYW1ldGVyczpoLnRvU3RyaW5nKCl9fSxLYzpmdW5jdGlvbigpe3ZhciBhO3RyeXtyZXR1cm4gYT10aGlzLnNiKHRoaXMuTC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiRHVyYXRpb24iKVswXSksCmE9YS5zcGxpdCgiOiIpLGE9MzYwMCorYVswXSs2MCorYVsxXSsgK2FbMl0saXNOYU4oYSk/LTE6YX1jYXRjaChiKXtyZXR1cm4tMX19LGhtOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9ITEsYz0hMTt0cnl7ZD10aGlzLkwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxpbmVhciIpWzBdLGM9ZC5nZXRBdHRyaWJ1dGUoInNraXBvZmZzZXQiKSxiPWUudG8oYyxhKSwwPmImJihiPSExKX1jYXRjaChmKXtiPSExfXJldHVybiBifSxOZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMuc2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LFFlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxzYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLkZkKGEpOiIifSxGZDpmdW5jdGlvbihhKXt2YXIgYj0KdGhpcy5RZShhKTtiJiYoYj1iLnRyaW0oKSk7IWImJmEudGV4dENvbnRlbnQmJihiPWEudGV4dENvbnRlbnQsYj1iLnRyaW0oKSk7cmV0dXJuIGJ9fX0pKGMpO3ZhciBTPWMucWt8fFM7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlBpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVWE9Yy5QaXx8VWE7bmV3IFVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5PYT1bXTt0aGlzLk89W107dGhpcy5xYj0iIjt0aGlzLnM9dGhpcy54Yz10aGlzLkNiPSExO3RoaXMuVWU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLlZlPSIifWMuVmo9YTthLnByb3RvdHlwZT17dmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5PLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sYm06ZnVuY3Rpb24oKXtpZighdGhpcy5VZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLm5hKXt2YXIgYT10aGlzLm9yaWdpbi5uYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT0KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpLGM9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKShjPWFbZF0uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yy5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5VZT1hW2RdKX1yZXR1cm4gdGhpcy5VZX0saGg6ZnVuY3Rpb24oKXtpZih0aGlzLlZlKXJldHVybiB0aGlzLlZlO3ZhciBhPSIiOyhhPXRoaXMuYm0oKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLlZlPWF9LGxtOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGM9MDtjPHRoaXMuTy5sZW5ndGg7YysrKWlmKDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tjXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bY10udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2NdO3JldHVybiBhfX19KShjKTt2YXIgU2E9Yy5Wanx8U2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLk9pPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgVmE9Yy5PaXx8VmE7bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3ZhciB2PXttZTp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixOYToiWE1MX1BBUlNFX0VSUk9SIn0sZGc6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLE5hOiJEVVJBVElPTl9FUlJPUiJ9LGVkOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixOYToiRU1QVFlfVkFTVCJ9LGhnOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLApOYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0sZWc6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsTmE6IkxPQURfRVJST1IifSxpZTp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsTmE6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSwKenA6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsTmE6Ik1FRElBRklMRV9FUlJPUiJ9LGZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLE5hOiJEVU1NWV9BRCJ9fSxGPXtmZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLE5hOiJOT19BRFMifSxnZzp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsTmE6Ik5PX01FRElBRklMRVMifSxBcDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIixOYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGxlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE5hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Laj1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBXYT1jLktqfHxXYTtuZXcgV2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuZXJyb3I9YTt0aGlzLnpkPWM7dGhpcy5PYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuZGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmRqfHxUYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBYYT1jLk5sfHxYYTtuZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuYWk9YTt0aGlzLnZpZGVvPWM7dGhpcy5hZT1bXTt0aGlzLlloPVtdO3RoaXMub2Y9W107dGhpcy5mcD0KImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLkooKX1jLkJwPWE7YS5wcm90b3R5cGU9e0o6ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuYWkubGVuZ3RoO2ErKyl7dmFyIGM9dGhpcy5haVthXSxkPWMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGU9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7aC5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGgpO3ZhciBrPWguY29udGVudFdpbmRvdztrLnRxPQp7cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5Wbi5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5Nbi5iaW5kKHRoaXMpfTt2YXIgbD1rLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2wuc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtsLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9ZDtrLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7ay5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO3RoaXMuYWUucHVzaCh7c3JjOmQsZnJhbWU6aCx2bjplLHZlbmRvcjpjLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5vZi5sZW5ndGg7YysrKXt2YXIgZD10aGlzLm9mW2NdO2QudHlwZT09PWEmJmQuZmwodGhpcy5XbChhKSl9fSwKV2w6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7Q3E6ITAsQnE6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7cXE6InZpZGVvIixGcToianNDdXN0b20iLEdxOiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsSHE6MSwkcDowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LAprbTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDtjPHRoaXMuYWUubGVuZ3RoO2MrKylpZih0aGlzLmFlW2NdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuYWVbY10udm47cmV0dXJuIiJ9LFZuOmZ1bmN0aW9uKGEsYyl7dGhpcy5ZaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5rbShjKSx2ZW5kb3I6Y30pO3RoaXMudm8oKX0sTW46ZnVuY3Rpb24oYSxjKXsidmlkZW8iPT09YT90aGlzLmZwLm1hcChmdW5jdGlvbihhKXt0aGlzLnlnKGEsYyl9LmJpbmQodGhpcykpOnRoaXMueWcoYSxjKX0seWc6ZnVuY3Rpb24oYSxjKXt0aGlzLm9mLnB1c2goe3R5cGU6YSxmbDpjLHpxOiExfSl9LHZvOmZ1bmN0aW9uKCl7dGhpcy5ZaC5tYXAoZnVuY3Rpb24oYSl7YS5JbXx8KGEuc3Eoe2FkU2Vzc2lvbklkOmUuWSgyMCksdHlwZToic2Vzc2lvblN0YXJ0Iix0aW1lc3RhbXA6RGF0ZS5ub3coKSxkYXRhOnt2ZXJpZmljYXRpb25QYXJhbWV0ZXJzOmEuRHEsY29udGV4dDp0aGlzLmdldENvbnRleHQoKX19KSwKYS5JbT0hMCl9LmJpbmQodGhpcykpfX19KShjKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuWGs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYT1jLlhrfHxZYTtuZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShhLGMpe3RoaXMuY29uZj1jfHx7fTt0aGlzLmM9YTt0aGlzLnJiPWEuZWgoKTt0aGlzLkk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5JLmlkPWUuWSgxMCk7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuSGE9e307dGhpcy56Zz0hMTsKdGhpcy5lYz1bXX1jLmNqPWE7YS5wcm90b3R5cGU9e1BsOmZ1bmN0aW9uKGEpe3ZhciBjPXt9LGQ9ITEsZT0wLGM9MCxoPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYz1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9ImZpeGVkIixlPWMubGVmdCxjPWMudG9wKTtoPXt4OmUseTpjfTtoLnBvc2l0aW9uPWQ7cmV0dXJuIGh9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuUGwoYSk7Zm9yKHZhciBjPTAsZD0wLGU9ITEsaD10aGlzLnNtKGEpLGs9e307YTspYys9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxkKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2gmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsCmMrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGQrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGU9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2s9e3g6Yyx5OmR9O2UmJihrLnBvc2l0aW9uPWUpO3JldHVybiBrfSxDbzpmdW5jdGlvbigpe3RoaXMuemc9ITB9LHhpOmZ1bmN0aW9uKCl7dGhpcy5CPUQucG9wKCk7dGhpcy5CfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkIuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxRaDpmdW5jdGlvbigpe3RoaXMuYy5wYXVzZSgpO2UubyhrLkdjLHRoaXMuYy5sKCkpfSxZbjpmdW5jdGlvbigpe3RoaXMuemd8fAoodGhpcy5jLnBsYXkoKSxlLm8oay52ZCx0aGlzLmMubCgpKSl9LElmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmMucGF1c2UoKTt0aGlzLkkuc3R5bGUuekluZGV4PWE7dGhpcy5JLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSS5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5JLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5JLnN0eWxlLmJveFNpemluZz10aGlzLnJiLnN0eWxlLmJveFNpemluZzt0aGlzLkkuc3R5bGUud2lkdGg9dGhpcy5yYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5JLnN0eWxlLmhlaWdodD10aGlzLnJiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5CLnN0eWxlLndpZHRoPXRoaXMucmIub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQi5zdHlsZS5oZWlnaHQ9dGhpcy5yYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5yYik7CnRoaXMuYy5YYyYmdGhpcy5jLlhjKCk/dGhpcy5jLmVoKCkuYXBwZW5kQ2hpbGQodGhpcy5JKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSSk7d2luZG93LnNldFRpbWVvdXQodGhpcy5sYy5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmMuZXhpdEZ1bGxzY3JlZW4oKX0sc206ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGQ9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxjJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2Q9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yy5wb3NpdGlvbj9jLnBvc2l0aW9uPWMucG9zaXRpb246Yy5wb3NpdGlvbj0iYWJzb2x1dGUiO2Mud2lkdGg9YS5vZmZzZXRXaWR0aDtjLmhlaWdodD1hLm9mZnNldEhlaWdodDsKcmV0dXJuIGN9LGxjOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuTWwodGhpcy5yYik7aWYoYy54IT10aGlzLkhhLnh8fGMueSE9dGhpcy5IYS55fHxjLnBvc2l0aW9uIT10aGlzLkhhLnBvc2l0aW9ufHxjLndpZHRoIT10aGlzLkhhLndpZHRofHxjLmhlaWdodCE9dGhpcy5IYS5oZWlnaHR8fGEpe2lmKDA8dGhpcy5IYS53aWR0aCYmMDx0aGlzLkhhLmhlaWdodCYmMD09Yy53aWR0aCYmMD09Yy5oZWlnaHQpe3RoaXMuU2UoKTtyZXR1cm59dGhpcy5IYT1jO3RoaXMuYy5YYygpPyh0aGlzLkkuc3R5bGUubGVmdD0iMHB4Iix0aGlzLkkuc3R5bGUudG9wPSIwcHgiKToodGhpcy5JLnN0eWxlLmxlZnQ9Yy54KyJweCIsdGhpcy5JLnN0eWxlLnRvcD1jLnkrInB4Iik7dGhpcy5JLnN0eWxlLndpZHRoPWMud2lkdGgrInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7dGhpcy5JLnN0eWxlLnBvc2l0aW9uPWMucG9zaXRpb247dGhpcy5CLnN0eWxlLndpZHRoPWMud2lkdGgrInB4IjsKdGhpcy5CLnN0eWxlLmhlaWdodD1jLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLmVjLmxlbmd0aDthKyspdGhpcy5lY1thXSh7d2lkdGg6Yy53aWR0aCxoZWlnaHQ6Yy5oZWlnaHR9KX1lLk5mKHRoaXMuSSkmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMubGMuYmluZCh0aGlzKSwxMCl9LHhnOmZ1bmN0aW9uKGEpe3RoaXMuZWN8fCh0aGlzLmVjPVtdKTsiZnVuY3Rpb24iPT10eXBlb2YgYSYmdGhpcy5lYy5wdXNoKGEpfSxTZTpmdW5jdGlvbigpe3RoaXMuSSYmdGhpcy5JLnBhcmVudE5vZGUmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkJiZ0aGlzLkkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkkpO3RoaXMuQiYmdGhpcy5CLnBhdXNlJiZ0aGlzLkIucGF1c2UoKX19fSkoYyk7Zm9yKHZhciBaYT1jLmNqfHxaYSxEPVtdLCRhPTA7MTAwPiRhOyRhKyspe3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7TS5zdHlsZS5kaXNwbGF5PSJibG9jayI7TS5pZD0KZS5ZKDEwKTtNLmNvbnRyb2xzPSEwO0QucHVzaChNKX12YXIgSj0hMSxjYT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ybj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFiPWMucm58fGFiO25ldyBhYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZWxlbWVudElkLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYSk7Ynx8CihhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKSk7dGhpcy5UKGIpO3RoaXMuUWQoYSk7dGhpcy5PZygpfSxRZDpmdW5jdGlvbihhKXt0aGlzLmlkfHwodGhpcy5pZD1hKX0sT2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlRhKCksYj10aGlzLnZpZGVvVGFnO2J8fCgoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5WKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZygpfS5iaW5kKHRoaXMpLDEwMCkpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSx1YTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7YS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZyYmCmEuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sV2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBhcmFtZXRlcnMmJiExPT09YS5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LGthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYT9hLm11dGVkOiEwfSxsOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj10aGlzLnZpZGVvVGFnLGM9dGhpcy5UYSgpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1jKWEuY29udGFpbmVySWQ9Yy5pZDthLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhfX0pfSkoYyk7dmFyIGJiPWMuUGp8fGJiOyhmdW5jdGlvbihjKXtjLk9qPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kYSgpO3RoaXMuYmM9dGhpcy5iY3x8ITE7dGhpcy5wZz10aGlzLnJnPQp0aGlzLndoPXRoaXMudmE9dGhpcy5TZj0hMTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19FUlJPUiwiZXhhbXBsZSIsZnVuY3Rpb24oYSxiKXt0aGlzLktsKGEsYil9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLkFEU19QTEFZRUQsImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5TZj0hMDt0aGlzLndoJiZ0aGlzLkdnKCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLlBMQVlJTkcsImV4YW1wbGUiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuS2I7YSYmYS5uYyYmdGhpcy5nZXRQbGF5ZXIoKS5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2IubWIuc3Vic2NyaWJlKGEuRVZFTlRTLklOSVRJQUxfUExBWSwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLnRkKCk7dGhpcy53aD0hMDt0aGlzLkdnKCl9LmJpbmQodGhpcykpOwp0aGlzLkNnKCl9LEdnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuYmMpe3RoaXMudGQoKTtpZighdGhpcy5TZiYmIXRoaXMudGQoKSlyZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKSwhMDt0aGlzLlNmJiZ0aGlzLnBnJiYhdGhpcy5yZyYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19LHRkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5raCgiYWRNYW5hZ2VyQ29udHJvbGxlciIpO3JldHVybiBhJiZhLmFkTWFuYWdlcnMmJmEuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdfSxraDpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxjPTA7YzxiLm1vZHVsZXMubGVuZ3RoO2MrKyl7dmFyIGQ9Yi5tb2R1bGVzW2NdO2lmKGQubmFtZT09PWEpcmV0dXJuIGQuaW5zdGFuY2V9fSxDZzpmdW5jdGlvbigpe2lmKHRoaXMudGQoKSl7dmFyIGE9CnRoaXMua2goImFkTWFuYWdlckNvbnRyb2xsZXIiKS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl07dGhpcy5yZz0wPGEuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLnBnPWEuWHB9dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2coKX0uYmluZCh0aGlzKSwxMDApfSxhcTpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc0FkUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNBZFBsYXlpbmc/YS5vcSgpOiExfSxLYzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBZER1cmF0aW9uJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5nZXRBZER1cmF0aW9uP2EuS2MoKTotMX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc1BsYXlpbmc/YS5pc1BsYXlpbmcoKTotMX0sS2w6ZnVuY3Rpb24oYSxiKXt0aGlzLmJjPWIubWF0Y2goL1xkKy8pP3BhcnNlSW50KGIubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PQp0aGlzLmJjfHwzMDI9PXRoaXMuYmM/dGhpcy52YT0hMDp0aGlzLm0oImFkZXJyb3IiLHRoaXMuYmMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51ZCgpfS5iaW5kKHRoaXMpLDEwMCl9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnZhPyh0aGlzLncoKSx0aGlzLmlhKCkpOmEuV2UoKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6dGhpcy5lbShhKT8odGhpcy5DKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1hKCl9LmJpbmQodGhpcyksMkUzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnVkKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBjYj1jLk9qfHxjYjsoZnVuY3Rpb24oYyl7Yy5Raj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEttOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlpqLkZrLkRrP3dpbmRvdy5PTy5aai5Gay5Eay5WcChmdW5jdGlvbigpe30pOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS20oKX0sMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9MTUwMDt2YXIgYT1kYSgpO2lmKGEmJmEuX19pbnRlcm5hbCYmYS5fX2ludGVybmFsLnBsYXllcnMmJjA8ZS5QZShhLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBiIGluIGEuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGEuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGIpKXt2YXIgYz1uZXcgYmIoYS5fX2ludGVybmFsLnBsYXllcnNbYl0pO3RoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IGNiKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYj1jLlFqfHxkYixlYj1uZXcgZGIodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkVsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmI9Yy5FbHx8ZmI7bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSwKTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlZpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuZ2E9ITE7dGhpcy5uaCgpfSxuaDpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7YXx8KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YSYmIWImJihiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2EmJmI/KHRoaXMuVChhKSx0aGlzLlYoYikpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uaCgpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LE1hOmZ1bmN0aW9uKCl7dGhpcy5UaCgpfSxUaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1hP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaCgpfS5iaW5kKHRoaXMpLDEwMCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuVml8fGdiOyhmdW5jdGlvbihjKXtjLlVpPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LERnOmZ1bmN0aW9uKGEpe3ZhciBiPQphLmNvZGUsYz1hLm1lc3NhZ2U7YS5kYXRhJiYoYj1hLmRhdGEuY29kZSxjPWEuZGF0YS5tZXNzYWdlKTsxMjA1IT1iJiYoOTAwPT1iJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy5pYSgpKToxMDA5PT1ifHwzMDM9PWJ8fDQwMz09Yj90aGlzLmlhKCk6dGhpcy5pKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLmFkRXJyb3JFdmVudHMpZm9yKHZhciBiPTA7YjxhLmFkRXJyb3JFdmVudHMubGVuZ3RoO2IrKyl0aGlzLkRnKGEuYWRFcnJvckV2ZW50cyk7YS5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuRGcoYSl9LmJpbmQodGhpcykpO2EucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0saTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpPwp0aGlzLkMoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBoYj1jLlVpfHxoYjsoZnVuY3Rpb24oYyl7Yy5XaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFdoOmZ1bmN0aW9uKGEpe2E9bmV3IGdiKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwoYS5RZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5OKGEpLChuZXcgaGIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dGhpcy5MbHx8KHRoaXMuTGw9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLldoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYT0wO2E8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDthKyspdGhpcy5XaCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYV0pOwp0aGlzLlAoKX19KX0pKGMpO3ZhciBpYj1jLldpfHxpYixUPW5ldyBpYih0KTtULmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuV2s9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBqYj1jLldrfHxqYjtuZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5paz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7aWYoYSl7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5WKGIpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5KLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiKwp0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChhKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYSl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxYYzpmdW5jdGlvbigpe3ZhciBhPWw7cmV0dXJuIGEmJmEucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuaWt8fFU7KGZ1bmN0aW9uKGMpe2MuaGs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dy5tZCgiIyIrYSwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudy5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpOwp3Lm1kKCIjIithLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMubm4oYSl9LmJpbmQodGhpcykpO3cubWQoIiMiK2EsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkMoKX0uYmluZCh0aGlzKSk7dy5tZCgiIyIrYSwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5DKCl9LmJpbmQodGhpcykpO3cubm0oKX0sbm46ZnVuY3Rpb24oYSl7dmFyIGI9IiIsYztmb3IoYyBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYykpe2I9aXNOYU4oYVtjXSk/ITE6YVtjXTtpZigxMDA5PT1hW2NdfHwxMDAxPT1hW2NdfHwzMDM9PWFbY118fDQwMz09YVtjXSl7dGhpcy53KCk7dGhpcy5pYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYVtjXSlpZihhW2NdLmhhc093blByb3BlcnR5KGQpJiYoYj1pc05hTihhW2NdW2RdKT8hMTphW2NdW2RdLDEwMDk9PWFbY11bZF18fAoxMDAxPT1hW2NdW2RdfHwzMDM9PWFbY11bZF18fDQwMz09YVtjXVtkXSkpe3RoaXMudygpO3RoaXMuaWEoKTtyZXR1cm59fXRoaXMubSgiYWRlcnJvciIsYik7dGhpcy5DKCl9fSl9KShjKTt2YXIgVj1jLmhrfHxWOyhmdW5jdGlvbihjKXtjLmprPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBhPVtdLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTtiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKWEucHVzaChiW2NdKTt0aGlzLktkJiYoYT1lLkRsKGEsdGhpcy5LZCkpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBkPWFbYl0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk0oZCkpe3RoaXMuTihkKTsKdmFyIGc9bmV3IFYoZCx0aGlzLkcpO2cuZigpfX1mb3IoYj0wO2I8YS5sZW5ndGg7YisrKWZvcihjPWFbYl07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGg9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoaCl0cnl7dGZtc3VpdGUoIiMiK2gpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLktkfHwodGhpcy5LZD1bXSksdGhpcy5LZC5wdXNoKGFbYl0pLGQ9bmV3IFUoaCksdGhpcy5NKGQpfHwodGhpcy5OKGQpLGc9bmV3IFYoZCx0aGlzLkcpLGcuZigpKX1jYXRjaChrKXt9fX10aGlzLlAoKX0sbWQ6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuYmF8fCh0aGlzLmJhPXt9KTt0aGlzLmJhW2FdfHwodGhpcy5iYVthXT17fSk7dGhpcy5iYVthXVtiXXx8KHRoaXMuYmFbYV1bYl09W10pO3RoaXMuYmFbYV1bYl0ucHVzaChjKX0sTm86ZnVuY3Rpb24oYSl7dmFyIGI9YS5zUGxheWVyU2VsZWN0b3I7aWYoYSlpZighdGhpcy5iYXx8dGhpcy5iYSYmIXRoaXMuYmFbYl0pdGhpcy5TY3x8Cih0aGlzLlNjPVtdKSx0aGlzLlNjLnB1c2goYSksdGhpcy5YbigpJiYodGhpcy55ZigpLHRoaXMuZigpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGM9YS5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2JdW2NdJiYwPHRoaXMuYmFbYl1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5iYVtiXVtjXS5sZW5ndGg7ZCsrKXRoaXMuYmFbYl1bY11bZF0oYSl9fSxubTpmdW5jdGlvbigpe2lmKHRoaXMuU2MpZm9yKHZhciBhPTA7YTx0aGlzLlNjLmxlbmd0aDthKyspe3ZhciBiPXRoaXMuU2NbYV0sYz1iLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGQ9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmJhW2NdW2RdJiYwPHRoaXMuYmFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZT0wO2U8dGhpcy5iYVtjXVtkXS5sZW5ndGg7ZSsrKXRoaXMuYmFbY11bZF1bZV0oYil9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihhKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9CmEub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1hLm9FdmVudFR5cGUuaCYmdy5ObyhhKX19KX0pKGMpO3ZhciBrYj1jLmprfHxrYix3PW5ldyBrYih0KTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Tbz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGxiPWMuU298fGxiO25ldyBsYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlJpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMubXV0ZWQ9ITE7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5UKGEpO3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlYoYil9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EucGxheSgpfSl9LHVhOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe2EuaXNQbGF5aW5nKCkmJmEucGF1c2UoKX0pfSxrYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbWI9Yy5SaXx8bWI7KGZ1bmN0aW9uKGMpe2MuU2k9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7CiQoIiMiK2EpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7aWYoIWEuaXNQbGF5aW5nfHxhLmlzUGxheWluZygpKWEuaXNBZCYmYS5pc0FkKCk/dGhpcy53KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5tKCJub0FkIiwicGxheWVkIiksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCJub0FkIiwicGxheWVkIik7dGhpcy5DKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTsKYS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLkMoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG5iPWMuU2l8fApuYjsoZnVuY3Rpb24oYyl7Yy5UaT1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZhJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPWFbYl0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGg9bmV3IG1iKGQpO3RoaXMuTShoKXx8KHRoaXMuTihoKSwobmV3IG5iKGgsdGhpcy5HKSkuZigpKX1jYXRjaChrKXt9fXRoaXMuUCgpfSxNOmZ1bmN0aW9uKGEpe3ZhciBiPWEuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYik7Zm9yKHZhciBjIGluIHRoaXMuTGEpaWYoYj09dGhpcy5MYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDsKcmV0dXJuIHRoaXMuTGFbYS5qYSgpXT8hMDohMX19KX0pKGMpO3ZhciBvYj1jLlRpfHxvYixwYj1uZXcgb2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgcWI9Yy5ra3x8cWI7bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuTWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxKOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5JZz10aGlzLkljPSExLGI9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe3RyeXtpZihhJiZhLnNvdXJjZSYmYS5zb3VyY2UuX2VudnZhcnMpe3RoaXMudGx8fChhLnRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnVsKCl9LmJpbmQodGhpcykpLHRoaXMudGw9CiEwKTt2YXIgYj10aGlzLlZnKGEuc291cmNlLl9lbnZ2YXJzKTtiJiYodGhpcy5JYz1iKTtpZighdGhpcy5JZyYmKGEuc291cmNlLkNIT09TRVJfVElNRXx8YS5zb3VyY2UuQ0hPT1NFUl9BQikpe3ZhciBjPWEuc291cmNlLkNIT09TRVJfQUJ8fCIiLGg9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixjLCEwKTtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2ludGVyYWN0aW9uIixjKyhwYXJzZUludChoKT09aD8iIjoiX2F1dG9wbGF5IiksITApO2UudHJhY2soInN0YXRzX2Nob29zZXJfdGltZSIsaCwhMCk7dGhpcy5JZz0hMH19fWNhdGNoKGspe319LmJpbmQodGhpcykpO3RoaXMuRWQoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YSYmKGI9YSk7dGhpcy5UKGEpO3RoaXMuVihiKTt0aGlzLkxuKHRoaXMuZ2V0UmF3UGxheWVyKCksCmEpO3RoaXMuZ2V0UmF3UGxheWVyKCl9LHdnOmZ1bmN0aW9uKGEpe3RoaXMuZ2N8fCh0aGlzLmdjPVtdKTt0aGlzLmdjLnB1c2goYSl9LHVsOmZ1bmN0aW9uKCl7aWYodGhpcy5nYyYmdGhpcy5nYy5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmdjLmxlbmd0aDthKyspdHJ5e3RoaXMuZ2NbYV0oKX1jYXRjaChiKXt9fSxFZDpmdW5jdGlvbigpe2lmKHRoaXMuSWMpcmV0dXJuIHRoaXMuSWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuVmcoYSkpcmV0dXJuIHRoaXMuSWM9YX19LFZnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO2EmJmEudmlkZW9TbG90JiYoYj1hKTthJiZhLmhkdnBhaWQmJihiPWEuaGR2cGFpZCk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7fSxwbGF5OmZ1bmN0aW9uKCl7fSxMbjpmdW5jdGlvbihhLGIpe2EmJmEucGF1c2VFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEucGF1c2VFdmVudCwKZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmVhLm11dGUmJnRoaXMuZWEubXV0ZSgpfS5iaW5kKHRoaXMpKTthJiZhLnVubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS51bm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEudW5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS51bm11dGUmJgp0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0seGg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcmI9Yy5Nanx8cmI7KGZ1bmN0aW9uKGMpe2MuTGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLkZpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLkZpJiYodGhpcy5pKCksdGhpcy5GaT0hMCx0aGlzLm1hKCkpO2IuVGEoKS5hZGRFdmVudExpc3RlbmVyKGEucGxheUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5FZCgpP3RoaXMuQygpOih0aGlzLkhlfHwodGhpcy5IZT0xKSx0aGlzLkhlKyssMTAwPHRoaXMuSGU/dGhpcy5DKCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksCjEwKSl9fSl9KShjKTt2YXIgc2I9Yy5Manx8c2I7KGZ1bmN0aW9uKGMpe2MuTmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyByYihhW2RdKSx0aGlzLk0oYyl8fCh0aGlzLk4oYyksKG5ldyBzYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTt2YXIgdGI9Yy5Oanx8dGIsVz1uZXcgdGIodCk7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmtqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgdWI9Yy5ranx8dWI7bmV3IHViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnZrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVihhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGE/YS5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5kdXJhdGlvbn0sCk1hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWEoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHZiPWMudmt8fHZiOyhmdW5jdGlvbihjKXtjLnVrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LE1jOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxhPWEuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEuaW1hQWRzTG9hZGVyfSxKbjpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMuZmJ8fCh0aGlzLmZiPQpbXSk7dGhpcy5mYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMuaWEoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy5CYz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuaSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5CYT90aGlzLkpuKHRoaXMuQmEpOih0aGlzLkJhPXRoaXMuTWMoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0saTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcmJjE8YS5nZXRDdXJyZW50VGltZSgpKXtpZighdGhpcy5CYSl7dGhpcy5DKCk7CnJldHVybn1pZighdGhpcy5CYyl7dGhpcy5DKCk7cmV0dXJufWE9ITA7aWYodGhpcy5mYiYmdGhpcy5mYi5sZW5ndGgmJjE8dGhpcy5mYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmZiLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmZiW2JdJiYzMDMhPXRoaXMuZmJbYl0mJjQwMyE9dGhpcy5mYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMuaWEoKTtlbHNle3RoaXMuQygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmkoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHdiPWMudWt8fHdiOyhmdW5jdGlvbihjKXtjLndrPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3RoaXMuVmE9LTE7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYod2luZG93LndmdjRfaHRtbDVfcGxheWVyJiYwPGEubGVuZ3RoKWZvcih2YXIgYiBpbiBhKXt2YXIgYz1uZXcgdmIoYS5pdGVtKGIpKTsKdGhpcy5NKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgd2IoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHhiPWMud2t8fHhiLHliPW5ldyB4Yih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMud209YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB6Yj1jLndtfHx6YjtuZXcgemIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5kaz1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuVChhKTt0aGlzLlYoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5zZj0hMX0sTWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpOwp3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLkFuKCl9LmJpbmQodGhpcyksNTAwKX0sQW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5XJiZ0aGlzLlcoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0wO2EucGxheWJhY2suZ2V0UG9zaXRpb24mJihiPWEucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGJ9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5zZiYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5zZik7CnRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSx5bzpmdW5jdGlvbigpe3RoaXMuc2Y9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBBYj1jLmRrfHxBYjsoZnVuY3Rpb24oYyl7Yy5jaz11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpO3RoaXMudGM9MH0sZjpmdW5jdGlvbigpe3RoaXMuJG09MTA7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnRjfHwodGhpcy50Yz0wLGEuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5pKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSwKdGhpcy5pKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmkoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5pKCkpKToodGhpcy50Y3x8dGhpcy50YysrLHRoaXMudGM8PXRoaXMuJG0/KHRoaXMudGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuaSgpKSl9LGk6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLnlvKCksdGhpcy5DKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpOwp2YXIgQmI9Yy5ja3x8QmI7KGZ1bmN0aW9uKGMpe2MuZWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgQWIod2luZG93LnBsYXllckFwaSksdGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgQmIoYSx0aGlzLkcpKS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBDYj1jLmVrfHxDYixEYj1uZXcgQ2IodCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlwPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgRWI9Yy55cHx8RWI7bmV3IEViKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmJrPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5WKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPSIiO2EuY3VycmVudFRpbWUmJihiPWEuY3VycmVudFRpbWUpO3JldHVybiBifSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPQp0aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sTWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5XKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk1hKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEZiPWMuYmt8fEZiOyhmdW5jdGlvbihjKXtjLmFrPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLlRhKCksYj10aGlzLmdldFBsYXllcigpLnZpZGVvVGFnO2ImJmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0IixmdW5jdGlvbigpe3RoaXMubWEoKTt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz0hMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTthLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLApmdW5jdGlvbigpe3RoaXMud2woKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5HYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMuUW0oKTp0aGlzLkZnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm5nKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5pKCEwKSl9LmJpbmQodGhpcyksMUUzKX0sd2w6ZnVuY3Rpb24oKXt0aGlzLm5nKCl8fHRoaXMuaSghMCl9LFFtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5HYigpOyFhLnBhJiZhLlgmJmEuVXAmJmEuV3AmJih0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5pKCkpfSxGZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2IoKTthLmFkc0xvYWRlcj9hLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsCmZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5pYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmkoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuTmgpZm9yKHZhciBhPWMuZmQuR2IoKSxiPXRoaXMuZ2V0UGxheWVyKCkuVGEoKS5pZCxmPTA7ZjxhLmxlbmd0aDtmKyspYVtmXS5pZD09YiYmKHRoaXMuTmg9YVtmXSk7cmV0dXJuIHRoaXMuTmh9LHBxOmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbWE/IWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGE6ITF9LGk6ZnVuY3Rpb24oYSl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/CmE/dGhpcy5HYigpLmFkc0xvYWRlcj90aGlzLkMoITApOnRoaXMuQygpOnRoaXMuQygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLmFrfHxHYjsoZnVuY3Rpb24oYyl7Yy5mZD1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LG5sOmZ1bmN0aW9uKGEpe2E9bmV3IEZiKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLk0oYSl8fCh0aGlzLk4oYSksKG5ldyBHYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1jLmZkLkdiKCk7aWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5ubChhW2JdKTt0aGlzLlAoKX19KTtjLmZkLkdiPWZ1bmN0aW9uKCl7dmFyIGE9W107aWYobCYmbC5wbGF5ZXJhcGkmJihhPWwucGxheWVyYXBpKCkpJiZhLmxlbmd0aClyZXR1cm4gYTt2YXIgYT0KW10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kKSxiW2NdJiZiW2NdLnBhcmVudEVsZW1lbnQmJmJbY10ucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QmJmEucHVzaChiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5mZXJtb2QpOwppZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgSGI9Yy5mZHx8SGIsSWI9bmV3IEhiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5wbj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEpiPWMucG58fEpiO25ldyBKYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYT1hLmZpcnN0Q2hpbGQpO2lmKGEpe3RoaXMuVChhKTtpZihhLnRhZ05hbWUpe3ZhciBiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Ynx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWI/CnRoaXMuVihiKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfSxucTpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuVWEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7aWYoRyl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wbGF5KGEuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBsYXkiKX0sdWE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhJiYhYS5wYXVzZWQ/KHRoaXMucGF1c2UoKSwhMCk6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LApYYzpmdW5jdGlvbigpe3JldHVybiEwfSxUYTpmdW5jdGlvbigpe3ZhciBhO0c/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFg9Yy5Ianx8WDsoZnVuY3Rpb24oYyl7Yy5Haj11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy50Zj0iIjt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EmJih0aGlzLnRmPWEuaWQpO0c/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBjPWEucGxheWVyQ29udGFpbmVyO2MmJnRoaXMudGYmJmMhPXRoaXMudGZ8fAoiYWRlcnJvciIhPWEuZXZlbnR8fGUuRCgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEudXEpLHRoaXMuQygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLm0oImFkZXJyb3IiKSx0aGlzLkMoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubWEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkdqfHxZOyhmdW5jdGlvbihjKXtjLklqPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9CiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRylmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBYKGEpLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSlhPW5ldyBYKGEpLGEuZ2E/dGhpcy55ZigpOnRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBZKGEsdGhpcy5HKSxhLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRyxLYj1jLklqfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPQp7fX0pKGMpO3ZhciBNYj1jLk5pfHxNYjtuZXcgTWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5taj1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLGM9YS5HZXRFbCgpLGImJmM/KHRoaXMuVChjKSx0aGlzLlYoYikpOnRoaXMuVSgpKTp0aGlzLlUoKTp0aGlzLlUoKTp0aGlzLlUoKX0sZGk6ZnVuY3Rpb24oKXt9LGthOmZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihhPSEwKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKYT9iLklzUGF1c2VkKCkmJmIuUGxheSgpOihiLlBsYXkoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheSghMCl9LmJpbmQodGhpcyksMTApKX0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGtuOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMubWp8fE5iOyhmdW5jdGlvbihjKXtjLmxqPXUuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLks9dGhpcy5LfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuQWUoKTthLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmhhbmRsZUVycm9yKGEpfS5iaW5kKHRoaXMpKTthLk9uKCJhZEZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2EuT24oImFkTWlkcG9pbnQiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLk9uKCJhZFRoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXthLmRldGFpbCYmImNvbnRlbnRQbGF5ZXJQbGF5Ij09YS5kZXRhaWwubmFtZSYmdGhpcy5tYSgpfS5iaW5kKHRoaXMpKX0sQWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPWEuR2V0QWRFcnJvcnNDYWNoZSgpLGM9MDtjPGIubGVuZ3RoO2MrKyl0aGlzLmhhbmRsZUVycm9yKGJbY10pO2EuQ2xlYXJBZEVycm9yc0NhY2hlKCl9LGhhbmRsZUVycm9yOmZ1bmN0aW9uKGEpe2lmKG51bGw9PWEpdGhpcy5BZSgpO2Vsc2V7aWYoIm9iamVjdCI9PXR5cGVvZiBhKWlmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0udmFzdEVycm9yQ29kZSYmKGE9YVtiXS52YXN0RXJyb3JDb2RlKTsKZWxzZSBhJiZhLnZhc3RFcnJvckNvZGUmJihhPWEudmFzdEVycm9yQ29kZSk7MTAwOT09YXx8MzAzPT1hfHw0MDM9PWE/KHRoaXMudygpLHRoaXMuaWEoKSk6KHRoaXMubSgiYWRlcnJvciIsYSksdGhpcy5pKCkpfX0saTpmdW5jdGlvbihhKXt0aGlzLkMoYSl9fSl9KShjKTt2YXIgT2I9Yy5sanx8T2I7KGZ1bmN0aW9uKGMpe2Mubmo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yazthfHwoYT13aW5kb3cuVE9ubGluZU1lZGlhcGxheWVyRnJhbWV3b3JrKTtpZihhJiZhLkdldEFsbFBsYXllcnMmJihhPWEuR2V0QWxsUGxheWVycygpKSYmMDxhLmxlbmd0aClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9bmV3IE5iKGFbYl0pO2MuZ2F8fHRoaXMuTShjKXx8KHRoaXMuTihjKSwobmV3IE9iKGMsdGhpcy5HKSkuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBQYj1jLm5qfHwKUGIsUWI9bmV3IFBiKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy51bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFJiPWMudW58fFJiO25ldyBSYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLllpPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0hMSxjPSExO2E/KGM9YS5lbCwoYj1hLmVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKSYmYz8odGhpcy5UKGMpLHRoaXMuVihiKSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxkaTpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt2YXIgYT0hMTt0aGlzLnBsYXllci5tdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5ZXIucGF1c2UoKX0sCnBsYXk6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LHVhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkJyaWRQbGF5ZXIifSxrbjpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBTYj1jLllpfHxTYjsoZnVuY3Rpb24oYyl7Yy5aaT11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLmFkZCgiYWRFcnJvciIsdGhpcy5oYW5kbGVFcnJvci5iaW5kKHRoaXMpKTthLmFkZCgiYWRGaXJzdFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkTWlkcG9pbnQiLHRoaXMudy5iaW5kKHRoaXMpKTthLmFkZCgiYWRUaGlyZFF1YXJ0aWxlIix0aGlzLncuYmluZCh0aGlzKSk7YS5hZGQoImFkVGhpcmRRdWFydGlsZSIsdGhpcy53LmJpbmQodGhpcykpfSwKaGFuZGxlRXJyb3I6ZnVuY3Rpb24oYSl7aWYobnVsbD09YSl0aGlzLkFlKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLmlhKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuaSgpKX19LGk6ZnVuY3Rpb24oYSl7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIFRiPWMuWml8fFRiOyhmdW5jdGlvbihjKXtjLiRpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuQnJpZCYmIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cuQnJpZC5wbGF5ZXJzKXt2YXIgYT13aW5kb3cuQnJpZCYmd2luZG93LkJyaWQucGxheWVycywKYjtmb3IoYiBpbiBhKXt2YXIgYz1uZXcgU2IoYVtiXSk7Yy5nYXx8dGhpcy5NKGMpfHwodGhpcy5OKGMpLHdpbmRvdy5icmlkcGxheWVyPWMsKG5ldyBUYihjLHRoaXMuRykpLmYoKSl9fXRoaXMuUCgpfX0pfSkoYyk7dmFyIFViPWMuJGl8fFViLFZiPW5ldyBVYih0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucW49YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBXYj1jLnFufHxXYjtuZXcgV2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy56az1yLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEo6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKWlmKChhPWFbMF0pJiYiQWR2ZXJ0aXNlbWVudCI9PWEuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKXRoaXMuVSgpOwplbHNle2Zvcih2YXIgYj1hO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTticmVha31iPWIucGFyZW50Tm9kZX10aGlzLlYoYSk7dGhpcy5UKGIpfWVsc2UgdGhpcy5VKCl9LFpkOmZ1bmN0aW9uKGEpe3ZhciBiPSExOyJmdW5jdGlvbiI9PT10eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50P2I9bmV3IEN1c3RvbUV2ZW50KGEse2RldGFpbDp7fX0pOihiPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGIuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZGF0YSkpO2ImJndpbmRvdy5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGIpfSxLbjpmdW5jdGlvbigpe3RoaXMuZGQ9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhkRXZlbnQiLGZ1bmN0aW9uKGEpe2lmKGEuZGV0YWlsJiYiYWRSZXF1ZXN0Ij09YS5kZXRhaWwubmFtZSl0cnl7dGhpcy5kZHx8KHRoaXMuZGQ9ITAsdGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1hZC1zdGFydGVkIikpfWNhdGNoKGIpe319LmJpbmQodGhpcykpfSwKcGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5aZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RoaXMuZGQmJih0aGlzLlpkKCJ4LWRsOC1oZC1jb250ZW50LWFkLWNvbXBsZXRlZCIpLHRoaXMuZGQ9ITEpLHRoaXMuWmQoIngtZGw4LWhkLWNvbnRlbnQtcmVzdW1lLXJlcXVlc3RlZCIpfWNhdGNoKGEpe3RoaXMudmlkZW9UYWcucGxheSgpfX0sdWE6ZnVuY3Rpb24oKXtpZighdGhpcy52aWRlb1RhZy5wYXVzZWQpcmV0dXJuIHRoaXMucGF1c2UoKSwhMH0sUjpmdW5jdGlvbigpe3JldHVybiJ4eW1hdGljIn19KX0pKGMpO3ZhciBYYj1jLnprfHxYYjsoZnVuY3Rpb24oYyl7Yy55az11LmV4dGVuZCh7ZzpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxYaDpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5fX2RsOF9hZHNMb2FkZXI7YT8oYSYmYS5hZGRFdmVudExpc3RlbmVyJiYoYS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkc0Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmZjKGEpfS5iaW5kKHRoaXMpKSxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpKSxhJiZhLmFkZEFkRXJyb3JMaXN0ZW5lciYmYS5hZGRBZEVycm9yTGlzdGVuZXIoZnVuY3Rpb24oYSl7dGhpcy5mYyhhKX0uYmluZCh0aGlzKSkpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGguYmluZCh0aGlzKSwxMCl9LGZjOmZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuZ2V0RXJyb3ImJihhLmdldEVycm9yKCksYj1hLmdldEVycm9yKCkpOwpiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMuR2s9ITAsMTAwOT09Yi5nZXRFcnJvckNvZGUoKXx8MzAzPT1iLmdldEVycm9yQ29kZSgpfHw0MDM9PWIuZ2V0RXJyb3JDb2RlKCk/dGhpcy53KCk6dGhpcy5pKCkpOih0aGlzLkdrfHx0aGlzLm0oIm5vZnJhbWV3b3JrIiksdGhpcy5pKCkpfSxrZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDthKyspdGhpcy5mYyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2FdKTt0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2cuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5YaCgpO3RoaXMua2coKTt0aGlzLk5uKCl9LE5uOmZ1bmN0aW9uKCl7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXJlcXVlc3QtYWRzLWZhbGxiYWNrIiwKdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLGZ1bmN0aW9uKGEpe3RoaXMuZmMoYSl9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuSG4/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKGEpe3RoaXMuSG49ITA7aWYoYSYmYS5kZXRhaWwpZm9yKHZhciBiIGluIGEuZGV0YWlsKSJhZFRhZ1VybCI9PWImJihhLmRldGFpbFtiXXx8dGhpcy5mYyhhKSl9fSl9KShjKTt2YXIgWWI9Yy55a3x8WWI7KGZ1bmN0aW9uKGMpe2MuQWs9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYT1uZXcgWGIod2luZG93LkRMOF9HTE9CQUxTKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYS5LbigpLGE9bmV3IFliKGEsCnRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLGEuZigpKX10aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLkFrfHxaYiwkYj1uZXcgWmIoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Uaz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGFjPWMuVGt8fGFjO25ldyBhYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLm5rPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3RoaXMuUmg9ITE7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnZpZGVvTW9kZWwpe3ZhciBiPWEudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihiKXt0aGlzLlQoYik7dmFyIGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVihjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZW49YX0uYmluZCh0aGlzKSksYS52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLlUoKX1lbHNlIHRoaXMuVSgpfWVsc2UgdGhpcy5VKCl9LGRpOmZ1bmN0aW9uKCl7fSxrYTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0xO3JldHVybiBhLnZpZGVvTW9kZWwmJmEudmlkZW9Nb2RlbC5nZXQmJihiPWEudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8Yik/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSx1YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUjpmdW5jdGlvbigpe3JldHVybiJ0djIifSxNYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZZChhKX0uYmluZCh0aGlzKSl9LFlkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmEmJihhPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGI9dGhpcy5nZXREdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTEmJiF0aGlzLlJoJiYodGhpcy5SaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBOPWMubmt8fE47KGZ1bmN0aW9uKGMpe2MubWs9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sQmE6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5MZSlpZih0aGlzLk1ifHwodGhpcy5NYj0wKSx0aGlzLk1iKyssMTU8dGhpcy5NYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5tbygpOnRoaXMuaSghMCksITA7dGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpO2EudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5pKCk6dGhpcy5pKCEwKX1lbHNlIGlmKGE9YS52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuTGU9ITA7dmFyIGI9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj0KZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhKTt0aGlzLndiKCl8fCh0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyksdGhpcy5pKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5CYSgpfS5iaW5kKHRoaXMpLDEwKX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sZGE6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuSz1hLGIubSgiYWRlcnJvciIsYSkpOmIubSgiYWRlcnJvciIpfXJldHVybiBjfWEub3JpZ2luYWxFdmVudCYmKGE9YS5vcmlnaW5hbEV2ZW50KTsKaWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7YnJlYWt9fSxmOmZ1bmN0aW9uKCl7dGhpcy5LPXRoaXMuS3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLkJhKCk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9CiEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImN1cnJlbnRBZFNlZ21lbnQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxpOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nP3RoaXMuQyhhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaShhKX0uYmluZCh0aGlzKSwKMTApfX0pfSkoYyk7dmFyIE89Yy5ta3x8TzsoZnVuY3Rpb24oYyl7Yy5vaz1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSk7dGhpcy5WYT0tMX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5pbnNlcnRlZFBsYXllcil7dmFyIGE9bmV3IE4od2luZG93Lmluc2VydGVkUGxheWVyKTthLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YisrKWE9bmV3IE4od2luZG93LlRWMlBsYXllcnNbYl0pLGEuZ2F8fHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBPKGEsdGhpcy5HKSxhLmYoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYiBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShiKSYmd2luZG93LlRWMlBsYXllcnNbYl0udmlkZW9Nb2RlbCYmCihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmdhfHx0aGlzLk0oYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpKTt0aGlzLnlmKCk7dGhpcy5QKCl9fSl9KShjKTt2YXIgYmM9Yy5va3x8YmMsY2M9bmV3IGJjKHQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy55bj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGRjPWMueW58fGRjO25ldyBkYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkNqPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyQ29udGFpbmVyO3RoaXMuVChhKTt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTsKdGhpcy5WKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImxhb2xhMSJ9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wbGF5KCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGF1c2UoKX19KX0pKGMpO3ZhciBaPWMuQ2p8fFo7KGZ1bmN0aW9uKGMpe2MuQmo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMudGg9MDt0aGlzLks9dGhpcy5LfHwhMTt0aGlzLmdldFBsYXllcigpO3RoaXMudmE9dGhpcy5PYz10aGlzLkJhPXRoaXMub2Q9ITE7dGhpcy5WaD1lLlFiKDEwKTt0aGlzLkJoKCl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihhLnN1YlBsYXllciYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlJiZhLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyKXJldHVybiB0aGlzLnBhPQphLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLHRoaXMueWIoKSwhMDt0aGlzLnRoKys7aWYoMTA8dGhpcy50aCl0aGlzLm0oIm5vZnJhbWV3b3JrIiwiSU1BIiksd2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3M/dGhpcy5pKCEwKTp0aGlzLmkoKTtlbHNlIHJldHVybiB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJoLmJpbmQodGhpcyksMTAwKSwhMX0seWI6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBhO2lmKGEpe3ZhciBiPSJhZEVycm9yIixjPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJgpnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoYz1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYS5hZGRFdmVudExpc3RlbmVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YigpfS5iaW5kKHRoaXMpLDIwKTooYS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5kYShhLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuSyk7dGhpcy5jYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnliKCl9LmJpbmQodGhpcyksMjApfSxkYTpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwKLTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLks9YSxiLm0oImFkZXJyb3IiLGEpKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPWEuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZiKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkoZCkmJmFbZF0mJmFbZF0uYWRFcnJvciYmYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmIoYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkVhKCk7CmJyZWFrfX0sd2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YX0sRWE6ZnVuY3Rpb24oKXt0aGlzLnZhPSEwfSxjYTpmdW5jdGlvbihhKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2IoKT8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoYSl9LmJpbmQodGhpcyksMTAwKX0saTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuYXBpLnBsYXllZCYmYi5hcGkucGxheWVkKCk/dGhpcy5DKGEpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLkJqfHxhYTsoZnVuY3Rpb24oYyl7Yy5Eaj1xLmV4dGVuZCh7ZzpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGI9CjA7Yjx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YisrKWE9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihhPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTShhKXx8KHRoaXMuTihhKSxhPW5ldyBhYShhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBlYz1jLkRqfHxlYyxmYz1uZXcgZWModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnZtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2M9Yy52bXx8Z2M7bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuaWo9ci5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSwKSjpmdW5jdGlvbigpe3ZhciBhPSExLGI9ITE7dHJ5e2E9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLGI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVihiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlUoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgaGM9Yy5panx8aGM7KGZ1bmN0aW9uKGMpe2MuaGo9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuRWcoKX0sRWc6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkMoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVnKCEwKX0uYmluZCh0aGlzKSwKMTAwKSl9fSl9KShjKTt2YXIgaWM9Yy5oanx8aWM7KGZ1bmN0aW9uKGMpe2Muamo9cS5leHRlbmQoe2c6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGhjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmdhKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTShhKSl7dGhpcy5OKGEpOyhuZXcgaWMoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBqYz1jLmpqfHxqYyxrYz1uZXcgamModCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlZrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbGM9Yy5Wa3x8bGM7bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkppPXIuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlYoYSk6dGhpcy5VKCkpOnRoaXMuVSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgbWM9Yy5KaXx8bWM7KGZ1bmN0aW9uKGMpe2MuSWk9dS5leHRlbmQoe2c6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsCmZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy5pLmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5pKCl9LmJpbmQodGhpcykpO3RoaXMuemUoKTt0aGlzLkJnKCl9LGRhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5LPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PQp0eXBlb2YgYy5nZXRFcnJvckNvZGUmJmIoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5FYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuRWEoKTticmVha319LHdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmF9LEVhOmZ1bmN0aW9uKCl7dGhpcy52YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sQmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7CndpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5pYSgpKTp0aGlzLmkoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLkJnLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuemUuYmluZCh0aGlzKSwxMDApfSx6ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMubWEuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5pKCk6dGhpcy5pKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnplLmJpbmQodGhpcyksMTAwKX19LGk6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5tYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5DKGEpfX0pfSkoYyk7dmFyIG5jPWMuSWl8fG5jOyhmdW5jdGlvbihjKXtjLktpPXEuZXh0ZW5kKHtnOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sU2E6ZnVuY3Rpb24oYSl7YT0KbmV3IG1jKGEpO2EuZ2E/dGhpcy5QKCk6dGhpcy5NKGEpfHwodGhpcy5OKGEpLChuZXcgbmMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuU2Eod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlNhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIG9jPWMuS2l8fG9jLHBjPW5ldyBvYyh0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYz1jLlVrfHxxYztuZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuQ2g9dGhpcy5FaD10aGlzLkRoPSExO3RoaXMuTWQ9W107dGhpcy54Zj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZmM/bnVsbDpmYyxWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIEFhP251bGw6QWEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgVD9udWxsOlQsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBJYj9udWxsOkliLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHZhP251bGw6dmEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGNjP251bGw6Y2MsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2Ygdz9udWxsOncsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBMYj9udWxsOkxiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mICRiP251bGw6JGIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFFiP251bGw6UWIsQnJpZFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBWYj9udWxsOlZiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgcGM/bnVsbDpwYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuWGo9YTthLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5mbShhKTpbXSxjO3RoaXMuRWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuRGg9CiEwO2Zvcih2YXIgZD0wO2Q8YS5sZW5ndGg7ZCsrKWM9YVtkXSx0aGlzLmNpKGMpfWVsc2UgZm9yKGQgaW4gdGhpcy54Zil7aWYodGhpcy5DaClicmVhaztjPXRoaXMueGZbZF07dGhpcy5XZihjKSYmKHRoaXMuTWQucHVzaChjKSx0aGlzLmNpKGMpKX19LFdmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcT8hMDohMX0sZm06ZnVuY3Rpb24oYSl7dmFyIGM9W10sZDtpZighYXx8IWEubGVuZ3RoKXJldHVybiBjO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWQ9YVtlXSxkPXRoaXMueGZbZF0sdGhpcy5XZihkKSYmYy5wdXNoKGQpO3JldHVybiBjfSxjaTpmdW5jdGlvbihhKXt0aGlzLldmKGEpJiZhLmYoKX0sQW86ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHImJiF0aGlzLkRoKWZvcih0aGlzLkNoPSEwLGE9MDthPHRoaXMuTWQubGVuZ3RoO2ErKyl0aGlzLk1kW2FdLlhiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuTWRbYV0uWGIpfX19KShjKTt2YXIgcmM9CmMuWGp8fHJjLEw9bmV3IHJjO0wuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Kaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHNjPWMuSmp8fHNjO25ldyBzYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYT1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWEuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWEuaW5kZXhPZigiaGQtbWFpbiIpKWE9Yy5tZXNzYWdlP2MubWVzc2FnZToiIixjPWMuZXJyb3Iuc3RhY2s/Yy5lcnJvci5zdGFjazoiIiwtMSE9YS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpPyhjPWEuc3Vic3RyaW5nKGEuaW5kZXhPZigiOiIpKzEsYS5pbmRleE9mKCJpcyBub3QiKS0KMSksZS5KYyhrLlhvKSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5KYyhrLmpuKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIHhjPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdyksdmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEg9bmV3IEksbD0hMTtILmZhKCk7SC55aCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEguZmEoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihILnloKCksCmZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO0guZmEoKTt2YXIgeWM9eGMoZnVuY3Rpb24oKXtlLllnKHdpbmRvdyxILkFtKCkse2lkOnljfSl9LDUwMCksaWE9ZS5ZKDEwKTtlYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Daz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRjPWMuQ2t8fHRjO25ldyB0YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5TaD10aGlzLmNvbmY9dGhpcy5KYj10aGlzLnBsYXllcj1udWxsO3RoaXMuSWQ9MDt0aGlzLmViPSIiO3RoaXMuTmQ9W107dGhpcy5PZD0wO3RoaXMuVWg9ITE7dGhpcy51Zj1bXTtlLnViKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5MaT1hO2EucHJvdG90eXBlPXtpbzpmdW5jdGlvbihhKXt0aGlzLlNoPWF9LEVmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPQphO3RoaXMuZWI9dGhpcy5wbGF5ZXIuUigpfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LGNvOmZ1bmN0aW9uKGEpe3RoaXMuSmI9YX0sYm86ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEphOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5lYl0mJnRoaXMuY29uZlt0aGlzLmViXVthXSYmKGM9dGhpcy5jb25mW3RoaXMuZWJdW2FdKTtyZXR1cm4gY30sWWM6ZnVuY3Rpb24oYSxjKXt2YXIgZD0hMSxnPSExO2lmKHRoaXMuQm0oKSl0aGlzLkpiLmcodGhpcy5KYi5OYyx0aGlzLkpiLnFhLHRoaXMuSmIud2YsZnVuY3Rpb24oKXt0aGlzLlljKGEsYyl9LmJpbmQodGhpcyksdGhpcy5KYi5oYyk7ZWxzZSBpZih0aGlzLnBtKCkpdGhpcy5abihmdW5jdGlvbigpe3RoaXMuWWMoYSxjKX0uYmluZCh0aGlzKSk7ZWxzZXt0aGlzLnBsYXllci5wYXVzZSgpO2UubyhrLkdjLHRoaXMucGxheWVyLmwoKSk7dmFyIGg9dGhpcy5jb25mLGw9Cm5ldyBaYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuQ28oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS51YigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBRYShsLHRoaXMuSmIsaCk7bC4kbih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuWm0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwic2hvdyIsITApOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBsYXllci5kZiYmKGQ9dGhpcy5wbGF5ZXIuZGYoKSk7aC5hZFN0YXJ0VGltZW91dCYmKGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt9LGguYWRTdGFydFRpbWVvdXR8fDVFNCkpO2wuZmYoYSxkLGcpO3RoaXMucGxheWVyLmZpKGwpfX0sQm06ZnVuY3Rpb24oKXt2YXIgYT1uZXcgRGF0ZSxjPTA7aWYodGhpcy5JZClyZXR1cm4gYz1hLmdldFRpbWUoKS0KdGhpcy5JZC5nZXRUaW1lKCksdGhpcy5JZD1hLDNFNTxjPyEwOiExO3RoaXMuSWQ9YTtyZXR1cm4hMX0sc286ZnVuY3Rpb24oKXtlLnViKCJwcmVyb2xsIik7ZS5EZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuSmEoImFkVGFnIik7dGhpcy5KYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuSmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLlVnKGEpKT90aGlzLlljKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9LHJvOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlNoKXtlLkRmKCJwb3N0cm9sbCIpO2UudWIoInBvc3Ryb2xsIik7dGhpcy5pbyghMCk7dmFyIGM9dGhpcy5jb25mLGQ9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJwb3N0cm9sbEFkVGFnIikmJihkPXRoaXMuSmEoInBvc3Ryb2xsQWRUYWciKSk7CihkPXRoaXMuVWcoZCkpP3RoaXMuWWMoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsudmQsdGhpcy5wbGF5ZXIubCgpKSl9fSxVZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sUm46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbyh0aGlzLnJvLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk1hKCl9LFNkOmZ1bmN0aW9uKGEpe2UudWIoIm1pZHJvbGwiKTtlLkRmKCJtaWRyb2xsIik7aWYoIXRoaXMuSGgpe3RoaXMuSGg9ITA7dmFyIGM9dGhpcy5KYSgiYWRUYWciKTt0aGlzLkphKCJtaWRyb2xsQWRUYWciKSYmKGM9dGhpcy5KYSgibWlkcm9sbEFkVGFnIikpO2M/KHRoaXMuWWMoYyxhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGg9CiExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLnZkLHRoaXMucGxheWVyLmwoKSkpfX0sUW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5obyh0aGlzLlNkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLmpmKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLnNvKCk7dGhpcy5wbGF5ZXIuamYmJnRoaXMuUW4oKTt0aGlzLlJuKCl9LFNuOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspKGZ1bmN0aW9uKGEsYixjLGYpe3RoaXMuTmQucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihlKXt0aGlzLmtiKGEsYixjLGYsZSl9LmJpbmQoZSl9KX0pLmNhbGwodGhpcyxhW2NdLnVybCxhW2NdLnBsYWNlaG9sZGVyLGFbY10uYWxpYXMsCmFbY10ubWFjcm8pfXRoaXMuT2Q9dGhpcy5OZC5sZW5ndGh9LHBtOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLk9kJiYoYT0hMCk7cmV0dXJuIGF9LFpuOmZ1bmN0aW9uKGEpe3RoaXMuVWg9YTtmb3IoYT0wO2E8dGhpcy5OZC5sZW5ndGg7YSsrKXRoaXMuTmRbYV1bImZ1bmN0aW9uIl0odGhpcy5Fbi5iaW5kKHRoaXMpKX0sRW46ZnVuY3Rpb24oYSl7dGhpcy5PZC0tO2EmJnRoaXMudWYucHVzaChhKTswPj10aGlzLk9kJiZ0aGlzLlVoKCl9LFptOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLnVmLmxlbmd0aDtkKyspYz10aGlzLnVmW2RdLGE9YS5yZXBsYWNlKGMubWFjcm8sYy5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBmYT1jLkxpfHxmYSxRPSExLG1hPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5waz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHVjPWMucGt8fHVjO25ldyB1YygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoeG9vU2VpaG9BY2hhYWNoaSx4b29TZWlob0FjaGFhY2hpKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.90.4
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.4.90.243.136.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame CB02
|
75 KB
25 KB
|
428ms
427ms
|
XHR
text/plain |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4313731504733197&correlator=3122855057706797&output=ldjh&impl=fif&eid=21065541%2C21065138%2C21065353%2C21065305&vrg=2020021101&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200218&iu=%2F53015287%2Fgolem.de_d_970x250_1_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C728x90%7C728x180%7C1000x150%7C31x31&scp=adslot%3Dbanner%26src%3Dsdg%26yieldlove_pid%3D17295%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522banner%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522wp%2522%252C%2522firepl%2522%252C%2522bb%2522%252C%2522leadb%2522%252C%2522dleadb%2522%252C%2522vidwa%2522%252C%2522brabo%2522%252C%2522fufrad%2522%252C%2522floor%2522%252C%2522vto%2522%255D%252C%2522as%2522%253A%255B%2522banner%2522%255D%252C%2522browserapp%2522%253A%255B%2522chrome%2522%255D%252C%2522hb_unit%2522%253A%255B%2522banner%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%252272c5521d51f4e1601a65d8033e3ced40%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-3%2522%252C%2522n155-0%2522%252C%2522n106-0%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-3%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-1%2522%252C%2522n137-0%2522%252C%2522n101-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-1%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-1%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n40-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n30-2%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-1%2522%252C%2522n105-1%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-0%2522%252C%2522n124-1%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-2%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17295.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A17295.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A17295.reload%253Afalse%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217295%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17295.reload%253Afalse%2522%255D%252C%2522yieldlove_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D203cd84864474705%3AT%3D1582023715%3AS%3DALNI_MZt9RHjASsS1dnhh3uWUD-Ihnpfzw&cdm=www.golem.de&bc=31&abxe=1&lmt=1582023716&dt=1582023716756&dlt=1582023716439&idt=307&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=250&oid=3&adx=308&ady=140&adk=3838874695&uci=5kldzx2dh5u7&ifi=1&ifk=1044686037&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=970x10&msz=970x10&ga_vid=1740209142.1582023715&ga_sid=1582023717&ga_hid=1023219915&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 469dc1230d6359b9343a4cd1820eb1d9e3da4365b22a7b88644e8824900d227f
- Security Headers
-
Name |
Value |
Content-Security-Policy |
child-src 'unsafe-inline' cm.g.doubleclick.net googleads.g.doubleclick.net www.google.com accounts.google.com pagead2.googlesyndication.com/pagead/s/cookie_push.html gmsg: https://tpc.googlesyndication.com/sadbundle/$csp%3Der3$/17676261649296892924/index.html;frame-src 'unsafe-inline' cm.g.doubleclick.net googleads.g.doubleclick.net www.google.com accounts.google.com pagead2.googlesyndication.com/pagead/s/cookie_push.html gmsg: https://tpc.googlesyndication.com/sadbundle/$csp%3Der3$/17676261649296892924/index.html;report-uri https://pagead2.googlesyndication.com/pagead/gen_csp?id=adbundle&qqi=CIanq8352ucCFVQq4Aodm9sP3A&gqi=JMRLXvyPMNutgAeyooioAw&layout=/sadbundle/%24csp%253Der3%24/17676261649296892924/index.html |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020021101.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame CB02
|
66 KB
24 KB
|
70ms
70ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame CB02
|
0
0
|
5ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame CB02
|
217 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame F33B
|
421 B
400 B
|
128ms
127ms
|
XHR
text/plain |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1069623884015002&correlator=3202109532648175&output=ldjh&impl=fif&eid=21065541%2C21065203%2C21065304%2C21065305&vrg=2020021101&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200218&iu=%2F53015287%2Fgolem.de_d_970x250_2_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C100x10%7C770x251%7C800x251%7C970x251%7C32x32&scp=adslot%3Dbillboard2%26src%3Dsdg%26yieldlove_pid%3D18494%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522billboard2%2522%255D%252C%2522af%2522%253A%255B%2522f2x1%2522%252C%2522f3x1%2522%252C%2522f4x1%2522%252C%2522f8x1%2522%252C%2522f10x1%2522%255D%252C%2522as%2522%253A%255B%2522billboard2%2522%255D%252C%2522browserapp%2522%253A%255B%2522chrome%2522%255D%252C%2522hb_unit%2522%253A%255B%2522billboard2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%252272c5521d51f4e1601a65d8033e3ced40%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-3%2522%252C%2522n155-0%2522%252C%2522n106-0%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-3%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-1%2522%252C%2522n137-0%2522%252C%2522n101-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-1%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-1%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n40-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n30-2%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-1%2522%252C%2522n105-1%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-0%2522%252C%2522n124-1%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-2%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A18494.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252218494%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A18494.reload%253Afalse%2522%255D%252C%2522yieldlove_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie_enabled=1&cdm=www.golem.de&bc=31&abxe=1&lmt=1582023716&dt=1582023716797&dlt=1582023716447&idt=344&ea=0&frm=23&biw=1585&bih=1185&isw=770&ish=251&oid=3&adx=408&ady=1659&adk=2948360638&uci=ipvlub856wn3&ifi=1&ifk=1036748905&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=770x10&msz=770x10&ga_vid=2069729278.1582023717&ga_sid=1582023717&ga_hid=185155068&fws=256&ohw=0&btvi=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ab9a1f5ee98dee04ff455be624ab15ca27dbe1e8da1f97273e3bfdb809a2f065
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020021101.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame F33B
|
66 KB
24 KB
|
65ms
65ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame F33B
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame F33B
|
220 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame A4A5
|
38 KB
10 KB
|
287ms
287ms
|
XHR
text/plain |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=44569376214484&correlator=1902367015494589&output=ldjh&impl=fif&eid=21064212%2C21065165%2C21065239%2C21065305&vrg=2020013001&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200218&iu=%2F53015287%2Fgolem.de_d_300x600_2_dc&sz=10x20%7C10x10%7C300x250%7C300x601%7C300x125%7C34x31&scp=adslot%3Drectangle%26src%3Dsdg%26yieldlove_pid%3D17299%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle%2522%255D%252C%2522af%2522%253A%255B%2522f1x2%2522%252C%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle%2522%255D%252C%2522browserapp%2522%253A%255B%2522chrome%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%252272c5521d51f4e1601a65d8033e3ced40%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-3%2522%252C%2522n155-0%2522%252C%2522n106-0%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-3%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-1%2522%252C%2522n137-0%2522%252C%2522n101-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-1%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-1%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n40-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n30-2%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-1%2522%252C%2522n105-1%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-0%2522%252C%2522n124-1%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-2%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17299.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A17299.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A17299.reload%253Afalse%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217299%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17299.reload%253Afalse%2522%255D%252C%2522yieldlove_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie_enabled=1&cdm=www.golem.de&bc=31&abxe=1&lmt=1582023716&dt=1582023716817&dlt=1582023716443&idt=368&frm=23&biw=1585&bih=1185&isw=300&ish=601&oid=3&adx=993&ady=1048&adk=2838689593&uci=qgvf4bzhomz2&ifi=1&ifk=4049690229&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x20&msz=300x20&ga_vid=1315201202.1582023717&ga_sid=1582023717&ga_hid=1335118843&fws=256&ohw=0&btvi=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 77c9d8144deb8f4ff8577b861a752f3bda8d502250021f4d3ff20ecb5e6b011a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020013001.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame A4A5
|
66 KB
24 KB
|
69ms
69ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame A4A5
|
0
0
|
5ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame A4A5
|
214 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 444A
|
425 B
406 B
|
132ms
132ms
|
XHR
text/plain |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1251896367120221&correlator=2347377461662321&output=ldjh&impl=fif&eid=21065400%2C21065541%2C21065305&vrg=2020021101&guci=1.2.0.0.2.2.0.0&sc=1&sfv=1-0-37&ecs=20200218&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C301x250%7C300x126%7C34x32&scp=adslot%3Drectangle2%26src%3Dsdg%26yieldlove_pid%3D17300%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522rectangle2%2522%255D%252C%2522af%2522%253A%255B%2522f1x1%2522%252C%2522mrec%2522%255D%252C%2522as%2522%253A%255B%2522rectangle2%2522%255D%252C%2522browserapp%2522%253A%255B%2522chrome%2522%255D%252C%2522hb_unit%2522%253A%255B%2522rectangle2%2522%255D%252C%2522keywords%2522%253A%255B%2522homepage%2522%252C%2522tsilkcalb%2522%252C%2522news%2522%252C%2522web%2522%252C%2522internet%2522%252C%2522headlines%2522%252C%2522newsletter%2522%252C%2522technology%2522%252C%2522computer%2522%252C%2522information%2522%252C%2522pc%2522%255D%252C%2522mbrid%2522%253A%255B%252272c5521d51f4e1601a65d8033e3ced40%2522%255D%252C%2522mbrseg%2522%253A%255B%2522ff6482ed%2522%252C%2522b3838f1f%2522%252C%252278315b65%2522%255D%252C%2522mtrcskv%2522%253A%255B%252250-1_75%2522%252C%252260-1_100%2522%252C%252265-1_75%2522%252C%252270-1_75%2522%252C%252280-1_75%2522%255D%252C%2522nuggad%2522%253A%255B%2522n127-0%2522%252C%2522n121-2%2522%252C%2522n116-0%2522%252C%2522n104-1%2522%252C%2522n15-3%2522%252C%2522n155-0%2522%252C%2522n106-0%2522%252C%2522n52-2%2522%252C%2522n153-1%2522%252C%2522n11-1%2522%252C%2522n120-3%2522%252C%2522n154-1%2522%252C%2522n125-1%2522%252C%2522n8-1%2522%252C%2522n137-0%2522%252C%2522n101-0%2522%252C%2522n108-0%2522%252C%2522n54-0%2522%252C%2522n110-1%2522%252C%2522n87-0%2522%252C%2522n149-0%2522%252C%2522n76-1%2522%252C%2522n66-1%2522%252C%2522n60-1%2522%252C%2522n139-1%2522%252C%2522n160-1%2522%252C%2522n107-1%2522%252C%2522n21-1%2522%252C%2522n40-1%2522%252C%2522n117-2%2522%252C%2522n86-0%2522%252C%2522n147-4%2522%252C%2522n64-0%2522%252C%2522n119-3%2522%252C%2522n30-2%2522%252C%2522n18-1%2522%252C%2522n161-1%2522%252C%2522n126-1%2522%252C%2522n92-1%2522%252C%2522n62-1%2522%252C%2522n57-1%2522%252C%2522n77-0%2522%252C%2522n83-0%2522%252C%2522n102-1%2522%252C%2522n105-1%2522%252C%2522n159-1%2522%252C%2522n20-1%2522%252C%2522n80-0%2522%252C%2522n12-6%2522%252C%2522n141-0%2522%252C%2522n157-1%2522%252C%2522n99-1%2522%252C%2522n128-2%2522%252C%2522n118-6%2522%252C%2522n85-1%2522%252C%2522n9-0%2522%252C%2522n6-2%2522%252C%2522n63-0%2522%252C%2522n58-1%2522%252C%2522n38-2%2522%252C%2522n138-0%2522%252C%2522n140-0%2522%252C%2522n94-2%2522%252C%2522n111-0%2522%252C%2522n136-1%2522%252C%2522n79-1%2522%252C%2522n93-3%2522%252C%2522n90-1%2522%252C%2522n43-1%2522%252C%2522n142-0%2522%252C%2522n7-2%2522%252C%2522n103-0%2522%252C%2522n158-0%2522%252C%2522n124-1%2522%252C%2522n75-0%2522%252C%2522n91-0%2522%252C%2522n46-1%2522%252C%2522n114-1%2522%252C%2522n69-0%2522%252C%2522n10-1%2522%252C%2522n3-2%2522%252C%2522n82-1%2522%252C%2522n33-1%2522%252C%2522n84-1%2522%252C%2522n5-5%2522%252C%2522n109-0%2522%252C%2522n122-1%2522%252C%2522n67-0%2522%252C%2522n115-1%2522%252C%2522n89-2%2522%252C%2522n123-2%2522%252C%2522n17-1%2522%252C%2522n78-1%2522%252C%2522n44-1%2522%252C%2522n81-1%2522%252C%2522n88-1%2522%252C%2522n39-1%2522%252C%2522n156-1%2522%252C%2522n148-0%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522tagm%2522%253A%255B%2522mt%2522%255D%252C%2522tagtype%2522%253A%255B%2522sra%2522%255D%252C%2522viewportheight%2522%253A%255B%25221153-1200%2522%255D%252C%2522viewportwidth%2522%253A%255B%25221581-1680%2522%255D%252C%2522yieldlove_ab%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_is_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%2522%255D%252C%2522yieldlove_meta_ab%2522%253A%255B%2522pid%253A17300.scenario%253Adefault%2522%255D%252C%2522yieldlove_meta_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217300%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17300.reload%253Afalse%2522%255D%252C%2522yieldlove_reload_count%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522never%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie_enabled=1&cdm=www.golem.de&bc=31&abxe=1&lmt=1582023716&dt=1582023716831&dlt=1582023716452&idt=374&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=3&adx=993&ady=4606&adk=4008869679&uci=ua42dt3x3umh&ifi=1&ifk=4200391111&u_tz=60&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&nhd=1&iag=3&url=https%3A%2F%2Fwww.golem.de%2F&top=www.golem.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=301x10&msz=301x10&ga_vid=128994075.1582023717&ga_sid=1582023717&ga_hid=2110819284&fws=256&ohw=0&btvi=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 98be9a4b20d8659e01eec8a668fea32a33d9124757d99c6ee33d7e72a5c654fb
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2020021101.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 444A
|
66 KB
24 KB
|
63ms
63ms
|
Script
text/javascript |
172.217.22.2
GOOGLE
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 444A
|
0
0
|
5ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 444A
|
210 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame C7AD
|
0
0
|
116ms
32ms
|
Document
text/html |
34.252.24.237
AMAZON-02
|
|
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
34ms
34ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/data?/3LdXD3WAAKktFLkqFFlqwF23A52AwwALl1FDLkqFKlkyB23A52AwwA2qoFx1A4yAwyAz3Ax0A32Ax5AlwBlvF02F4mEwBE/k0FPEmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B02A42AyxA4xAy0AmjEwpFk9BklFzrF0vFwmBhwFh9B1yA55A2wA5zA10AmjEpkF9xAz4AzwAzxAyzAyyAymAzpF6lF9zAwwA42BwwAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BzrF5mBhwFj9B1yA55A2wA5zA10AmhEwkF91Ay5A52Aw5Az1A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A20A1BELlnFBUkzF2BPuMAAZAwSAcAAAAPzGAAAAAAABul5APDAAFAAul5TYeNAPAAAXUAKAABYeNAZCAAOA55A55A85B55A58E55A55AGAyzA14A42ArYeNAPbAAXUAKAAHYeNASksFeFjAAAAAAAAAAAAEAAAul5AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEMAxzA4zAwzAxyAzyAyyAGAkpFylFj0FAAAAKA02A42AyxA4xAy0AKA1yA55A2wA5zA10ADAzrF5BFKA1yA55A2wA5zA10AKA1yA55A2wA5zA10AxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAAYeNAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFzTQmUA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
31ms
31ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/data?/3LdXEEXAA/k0FpImvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B02A42AyxA4xAy0AmjEwpFk9BklFzrF0vFwmBhwFh9B1yA55A2wA5zA10AmjEpkF9xAz4AzwAzxAyzAyyAymAzpF6lF9zAwwA42BwwAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BzrF5mBhwFj9B1yA55A2wA5zA10AmhEwkF91Ay5A52Aw5Az1A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A20A1mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A41A5BELlnFCUkzFYBP1CAAAAAAAB2CkAPAAAFAA2CkTl5/APAAA0EAMCABl5/AZCAAOA55A55A85B55A58E55A55AGAx0A32Az4Arl5/ASksFwFjAAAAAAAAAAAAEAAA2CkAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AwBEMAxzA4yA23A13A4wA0wANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A35A34A52AGAihFuuFlyFKA04A45A35A34A52AKA04A45A35A34A52A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFd0EAMCAKPA6DAFAAAl5/AAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFT3IWWA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
56ms
34ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/data?/3LdXFFXAA/k0FLNmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B02A42AyxA4xAy0AmjEwpFk9BklFzrF0vFwmBhwFh9B1yA55A2wA5zA10AmjEpkF9xAz4AzwAzxAyzAyyAymAzpF6lF9zAwwA42BwwAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BzrF5mBhwFj9B1yA55A2wA5zA10AmhEwkF91Ay5A52Aw5Az1A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A20A1mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A41A5mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A45AwzA3zA0yA0mAjpFk9BxzA4yA2zA1yA50A5yAmzEp6Fl9B33Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B04A5wAz3Az0Ay0AmhEwkF90A45AwzA3zA0yA0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A43AxBELlnFDTkzFePKAAAAAAAABb44APBAAFAAb44TbosASksFCFjAAAAAAAAAAAAEAAAb44AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AxBEMAxzA4yA2zA1yA50A5yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A5wAz3Az0Ay0AKAipFssFivFhyFkyBKA04A5wAz3Az0Ay0AKA04A5wAz3Az0Ay0A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBQtjF1QyBZA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
39ms
30ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
67ms
34ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/data?/3LdXHbXAA/k0FsRmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B02A42AyxA4xAy0AmjEwpFk9BklFzrF0vFwmBhwFh9B1yA55A2wA5zA10AmjEpkF9xAz4AzwAzxAyzAyyAymAzpF6lF9zAwwA42BwwAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BzrF5mBhwFj9B1yA55A2wA5zA10AmhEwkF91Ay5A52Aw5Az1A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A20A1mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A41A5mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A45AwzA3zA0yA0mAjpFk9BxzA4yA2zA1yA50A5yAmzEp6Fl9B33Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B04A5wAz3Az0Ay0AmhEwkF90A45AwzA3zA0yA0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A43AxmEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA14AywAyzA3xA24A51ATkzFARksFAQtjFyuQvZA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame F33B
|
7 KB
5 KB
|
18ms
17ms
|
XHR
application/json |
2a00:1450:4001:80b::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020021101&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- b0a398fa97778b589c5bc0066168feb9344be9af155ff51755c852c9b0fb7d61
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
31ms
31ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/data?/3LdXILYAALlnFEUkzFYBPWAAAAAAAABsahAPAAAFAAsahTTfPAPAAAhPAYQABTfPAZBAAOA55A55A85B55A58E55A55AGAxzA24A32ArTfPASksF8FjAAAAAAAAAAAAEAAAsahAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAxBEMAxzA4yA23A43Ay2A12ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A24Aw3A00AJAylFj0FhuFnsFlBFKA04A45A24Aw3A00AKA04A45A24Aw3A00A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFdhPAYQAsEAZJAFAAATfPAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFu0CySA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
31ms
31ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/data?/3LdXJLYAA/k0FUWmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B02A42AyxA4xAy0AmjEwpFk9BklFzrF0vFwmBhwFh9B1yA55A2wA5zA10AmjEpkF9xAz4AzwAzxAyzAyyAymAzpF6lF9zAwwA42BwwAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BzrF5mBhwFj9B1yA55A2wA5zA10AmhEwkF91Ay5A52Aw5Az1A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A20A1mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A41A5mEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A45AwzA3zA0yA0mAjpFk9BxzA4yA2zA1yA50A5yAmzEp6Fl9B33Aw4Ey1AxmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEpsFsiFvhFykFymAhwFj9B04A5wAz3Az0Ay0AmhEwkF90A45AwzA3zA0yA0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A4yAwyAz3Ax2A43AxmEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA14AywAyzA3xA24A51AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF90A44A54AwxAy0A3mAhwFk9B04A45A4wAxyA03AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA14AywAyzA3xA25A0yATkzFARksFAQtjFvDpJeA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame F33B
|
21 KB
8 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
28ms
28ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame 444A
|
7 KB
5 KB
|
18ms
17ms
|
XHR
application/json |
2a00:1450:4001:80b::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020021101&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 5aa2b7052183875cf3aac9c899276fc8387b3c1a0a61cde49b17b7c5a2049457
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/206/
Frame 4D63
|
0
0
|
5ms
5ms
|
Document
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/206/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame 444A
|
21 KB
8 KB
|
14ms
13ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/206/
Frame 81A8
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/206/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp4ads-host-v0.js
Show response
cdn.ampproject.org/rtv/012001281851410/
Frame A4A5
|
20 KB
7 KB
|
39ms
17ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001281851410/amp4ads-host-v0.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 94c64f16129178950ae198a21630de846ac0cef148890d92ca07ea212bc39834
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp4ads-v0.js
Show response
cdn.ampproject.org/rtv/012001281851410/
Frame F7EC
|
201 KB
55 KB
|
27ms
5ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001281851410/amp4ads-v0.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 083e70abc61231f062f9e884cbcfebf44d3b037acf0e5e7ee13cc13f2af4b877
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-ad-exit-0.1.js
Show response
cdn.ampproject.org/rtv/012001281851410/v0/
Frame F7EC
|
15 KB
6 KB
|
38ms
17ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001281851410/v0/amp-ad-exit-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 9d6368c6eab420dd270dd53602b62f1c2a61b0ee2bda36d38771b750ae1e1c90
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-analytics-0.1.js
Show response
cdn.ampproject.org/rtv/012001281851410/v0/
Frame F7EC
|
91 KB
27 KB
|
37ms
16ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001281851410/v0/amp-analytics-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 7817d24fae48a7de4fbe7af59036b89f5878161d346948494dc40fb408ff83bd
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-fit-text-0.1.js
Show response
cdn.ampproject.org/rtv/012001281851410/v0/
Frame F7EC
|
3 KB
1 KB
|
39ms
18ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001281851410/v0/amp-fit-text-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 33f5e031d6755d3d5e90bef966097c568dacd3e83905f4f474ccc76b9b335293
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp-form-0.1.js
Show response
cdn.ampproject.org/rtv/012001281851410/v0/
Frame F7EC
|
46 KB
15 KB
|
34ms
13ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001281851410/v0/amp-form-0.1.js
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- fefd977a8ac715eb04b55cc9eb25d11ae09e6e5b4a95791ba0a2ae51b7903387
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
DATA
|
200
OK
|
truncated
/
Frame F7EC
|
214 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
16661176271736642706
tpc.googlesyndication.com/simgad/
Frame F7EC
|
58 KB
58 KB
|
9ms
7ms
|
Image
image/png |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/simgad/16661176271736642706?sqp=4sqPyQQ7QjkqNxABHQAAtEIgASgBMAk4A0DwkwlYAWBfcAKAAQGIAQGdAQAAgD-oAQGwAYCt4gS4AV_FAS2ynT4&rs=AOga4qkKEYebi3LAtIG2bVsuP9h80Pu3dg
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- b63e26d1e2877caa4d3203174a8bec8dd5ae0465ac32ae2c2f91858d6936cd75
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
de.png
tpc.googlesyndication.com/pagead/images/adchoices/
Frame F7EC
|
3 KB
3 KB
|
8ms
7ms
|
Image
image/png |
2a00:1450:4001:81e::2001
GOOGLE
|
|
|
GET
H2
|
200
|
icon.png
tpc.googlesyndication.com/pagead/images/adchoices/
Frame F7EC
|
295 B
426 B
|
7ms
6ms
|
Image
image/png |
2a00:1450:4001:81e::2001
GOOGLE
|
|
|
GET
H2
|
200
|
adview
securepubads.g.doubleclick.net/pagead/
Frame F7EC
|
0
0
|
67ms
66ms
|
Image
text/html |
172.217.22.2
GOOGLE
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pagead/adview?ai=CXg5NJMRLXv7dNMqE7_UPiMmtwASjytnlW7m2n4j8Crzi1avfFxABII7z9BNgu4aAgNAKoAGG19e9A8gBAqkCxtZKToMssj7gAgCoAwHIAwiqBNABT9BwQmHagSHuYFvljNMDANWk70Ykiojiz4B2nJqLiSAxS9lDHEe3lOK-tO1vR-iaUtqb3qhfFCbyx2pLczJHqJLR3EPKI2nvHnD7P8V42xBflN3ulxzqDJRxV_8lw7b2hD0E5dl0GoaBttg1ayFTdKEkix2EKq3Piw5IGj6qDcCVCdips7oJ1Fzz6yvrJwN-slXztdMYTDDkjg4-ExP9qCAYKsR1dS7ZeVGcSFbSAK7LbRw_703SKW7faIcI8nwR596Dlh1BvW7K0Yt5b32de8AElJm3q9cC4AQBkgUECAQYAZIFBAgFGASgBgKAB-KoqEKoB47OG6gH1ckbqAeT2BuoB7oGqAfy2RuoB6a-G6gH7NUb2AcB8gcDEJx90ggJCIDhgBAQARgdgAoDyAsB2BMN&sigh=82x7nL62WDA&tpd=AGWhJmvgvvDK_-WXSoyqNqY2qa72mLWERf2Ax1LNMQkAAG2BaQ
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.22.2
, United States,
ASN15169
(GOOGLE, US),
- Reverse DNS
- fra16s14-in-f2.1e100.net
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
29ms
29ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame A4A5
|
7 KB
5 KB
|
17ms
17ms
|
XHR
application/json |
2a00:1450:4001:80b::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020013001&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020013001.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- fd1e13a1da11bb71c04deff3f24b00cfac75db23202cd2b4f46a3483228d30f1
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame F33B
|
0
54 B
|
17ms
17ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=206&t=2&li=gpt_2020021101&jk=1069623884015002&bg=!VValVk5Y9hkpnd31bJYCAAAAYVIAAAAWmQFeEGCtysSWZbIpt1Ss2eAFyq66use9V6r4bVA44Xggq7rglTBg1JJOKCGr5_mFDU_tDWZQEiFW1iyrKUv60iev0XsPSI5biUqjPAPXPFkJ44zF2KM7CYIXW95NA2ZCk7MzdBLEHhEuEfxQJe-azYDVMtyIIrSd319AyFeJ0-uluzyWScJqKzYXWZVbZYRe5BTTkaHT75WyKHwtrH5TWAA-MOY0nuFQOLCbH-G2SoqftF3ySPx3D02BFl5XMl0iGUyHrDchnNkiMWhnep_Z2w34YraRXeyS_iRKJ22Rtw7UqvYxhYz2zaRr6-F4cCj_KrX3hSZmUiL-27FPqmQmVoHWEKZAlzKB8pAlPUkVldbE9t2kEwrVdvf2irevPjeJ748tWEakkBK_l8gRyOO4IdLBT3kossin107x3YoE8FX13Qe-gs_aCA4Hg_LwaU9BQdavhZMRH3uR_YywRJwIQiw
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame A4A5
|
21 KB
8 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 444A
|
0
63 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=206&t=2&li=gpt_2020021101&jk=1251896367120221&bg=!uLulu6NYy7L95sPPR7gCAAAAXFIAAAAOmQFe4a1dAxhvGd8W2oBUgPxUqDF89NHKQMtiwQODasO5kisi2rByh9suKiD47hOrE5GrkoQROGLSlk8A2wgCKHco6BFvjTDtkxZHbF_UK_q1Jb0L1uxYHxlinvLf4kahFynU-RxOKNkFnctOkQ0ShB5wCLKVyNAPACJLl33CH1r5kiqSoXETjsOe_IRfI-NWX6HXHquMMRG0LA-E_t30l3bh_g69n4tFwTYB8fvmjGlVvWBR_4y4p0PWqfYQB-sQDPX9Dp7nd9gzldMqIA5DbIGgYg0wJBs6R8-AKEX2C5QPjBVzaLClmpxYNTUzhu93B-dvodgkiuV9lIuI-UThdVT3MKijg5onBIKgXhNTjateeDDTYAh8EF0UJqY57D5PabwN9v0YVEQouLQ-fXRMiYtCbUVv1uDJZ6YJpxU3KIk6gKEs6msF0NvkA-z-KN2dTAlh5ZCLnKt-p61ZLC0HOzU
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
amp4ads-host-v0.js
Show response
cdn.ampproject.org/rtv/012001281851410/
|
20 KB
7 KB
|
6ms
5ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://cdn.ampproject.org/rtv/012001281851410/amp4ads-host-v0.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20200212/r20190131/show_ads_impl_fy2019.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 94c64f16129178950ae198a21630de846ac0cef148890d92ca07ea212bc39834
- Security Headers
-
Name |
Value |
Content-Security-Policy |
default-src * blob: data:; script-src blob: https://cdn.ampproject.org/esm/ https://cdn.ampproject.org/lts/ https://cdn.ampproject.org/mp/ https://cdn.ampproject.org/rtv/ https://cdn.ampproject.org/sp/ https://cdn.ampproject.org/sw/ https://cdn.ampproject.org/v0.js https://cdn.ampproject.org/v0.mjs https://cdn.ampproject.org/v0/ https://cdn.ampproject.org/viewer/; object-src 'none'; style-src 'unsafe-inline' https://cdn.ampproject.org/rtv/ https://cdn.materialdesignicons.com https://cloud.typography.com https://fast.fonts.net https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com https://p.typekit.net https://pro.fontawesome.com https://use.fontawesome.com https://use.typekit.net; report-uri https://csp-collector.appspot.com/csp/amp |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
si
googleads.g.doubleclick.net/pagead/drt/
Frame F7EC
Redirect Chain
-
https://www.google.com/pagead/drt/ui
-
https://googleads.g.doubleclick.net/pagead/drt/si
|
0
0
|
40ms
39ms
|
Image
text/html |
2a00:1450:4001:81d::2002
GOOGLE
|
|
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/206/
Frame 2169
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/206/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-37/html/
Frame 08DD
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-37/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd.js
Show response
www.googletagservices.com/activeview/js/current/
Frame CB02
|
74 KB
27 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 98338d687e5f0016e85ba80b4de3c9c887e4dd4eb9ea5ac225ef1de42d149eb3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
204
|
win
Show response
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
|
0
57 B
|
30ms
29ms
|
XHR
text/plain |
35.156.162.45
AMAZON-02
|
|
|
GET
H2
|
200
|
sodar
Show response
pagead2.googlesyndication.com/getconfig/
Frame CB02
|
7 KB
5 KB
|
19ms
19ms
|
XHR
application/json |
2a00:1450:4001:80b::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/getconfig/sodar?sv=200&tid=gpt&tv=2020021101&st=env
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2020021101.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- d8dab49c583a3871114ea10498000496517de018f4b0dbde97329d605e38abf8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
662 B
|
28ms
27ms
|
Image
image/gif |
52.51.174.200
AMAZON-02
|
|
|
GET
H2
|
200
|
sodar2.js
Show response
tpc.googlesyndication.com/sodar/
Frame CB02
|
21 KB
8 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:81e::2001
GOOGLE
|
|
|
GET
H2
|
200
|
runner.html
tpc.googlesyndication.com/sodar/sodar2/206/
Frame 9260
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:81e::2001
GOOGLE
|
|
General
- Full URL
- https://tpc.googlesyndication.com/sodar/sodar2/206/runner.html
- Requested by
- Host: tpc.googlesyndication.com
URL: https://tpc.googlesyndication.com/sodar/sodar2.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame A4A5
|
0
64 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=206&t=2&li=gpt_2020013001&jk=44569376214484&bg=!ammlaXFYIOUaXyjW7joCAAAApFIAAABgmQFeu0Oc7uBO_Oanky9UkNX0IbpXc57UKLyjgFQ-MMKpKQPlC7UDHB3D_0czNBlEjfHiEcsV7lXRz5olkiNBWJp8yY-jKk6skIAAIovWFXjAF42iHogms_WTAne9FvKCMD1DD1Qahxd0E9Z7_IhedVQPoO5InrotcespapHPbZQZK1rKblnrnrAnW2lx_YC6fhNqI-Jo7szXB9eL_h5kEN-uGsA_NkUqcn4sskc3G-QQ4AO4kkmagIrLeBMqZbGVFCtz8ajs3PBpHn5PouCPRb1xCQ3Mv2ZkYizuGXNpgVOKN9jPII4htxCgvpGUIfBKpr2fTIWK5ZakxMLkfZUYeuIP9pYIVGXGWeLqnezf1d1HTjWuoTqwW0Qogiv0dov3E2exyGq4Pr3ZmY1DszZtKfT0ePYaK0GTq4XyPYUlJ6NXb-LbYPy27-fhaH6ihhiLCLkTJxW3KsC0ZMK7FoLSUcI
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame CB02
|
0
64 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=sodar2&v=206&t=2&li=gpt_2020021101&jk=4313731504733197&bg=!2tml2cFYNJHJAWsgV0ACAAAA2FIAAAAOmQFes4WwZ4a-lvUO_TofgNyzBHeGsjX7yN_6D0qO8QtrnxfDzhDowYX0vU69aqL-J5zGLyuWz0WRCnGHoghzFqPR1OcRKgIJydZborq0IoySSr5BEGPkdoIpVSZfo6DgrbFaqLk0_ruUwRpadw3JlY7FR3al_HAQX89Ys4GEI2Xy4vgL5iZhhVwgJCndXzvYgpA7D9S11FhCv_qheklhpYLxf-tx5Ra0-Fg3A2V7WygN4tIzYsY5ByYN7ZPLafQu-1sW9pp02kxQ64qQ7XQmmo0poylGaBI8N-Js0vrJ7x5QcqqtAe6UM70A71HxMa4hq3r0tGbqZcaasW6WkE0kQhUyIf49_8e8YMcBqfOrSboNzk2FJGYXjtLF437b-ytF_Jjc8yBSVtsWZDdJVqGmk7SKIZmuN88OHcTOeZCv51Ea0y60BKM256rHyAvnEWd5BWbf5jo2XonuiqF5fXe6XcI
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame ADFF
|
42 B
116 B
|
16ms
15ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsup7aoUH5JlvNFQVEab96W7PNSzXrnbdkHhgo0k7KfS6dde3lFdPgEaWdpqwiDSRXvlrfiHmNrp6sabW2BzcpqrX67MvSvo3OqOFPi14nc&sig=Cg0ArKJSzEm4th2rJMFLEAE&adk=2242890686&tt=-1&bs=1585%2C1185&mtos=0,1024,1024,1024,1024&tos=0,1024,0,0,0&p=10,1303,610,1603&sbeos=0&mcvt=1024&rs=0&ht=0&tfs=149&tls=1173&mc=0.94<e=0&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582023716436&dlt&rpt=216&isd=0&msd=0&ext&phel=1&phell=1&xdi=0&ps=1603%2C12909&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-4-11-11-0-0-0&tvt=1170&is=300%2C600&iframe_loc=https%3A%2F%2Fwww.golem.de%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200210
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame CB02
|
42 B
116 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsv92HoWuXyV_fNPfXikvrvYusO8HRdVJDPI-WkZjVGN7euD1a1miRrQOTQdyV6yCX46WNfLPxcpBIlLX50Y2udAp2yncUv_jX6AThOOxxg&sig=Cg0ArKJSzNNTFqhoOS0xEAE&adk=1956608835&tt=-1&bs=1585%2C1185&mtos=1033,1033,1033,1033,1033&tos=1033,0,0,0,0&p=140,308,390,1278&sbeos=0&mcvt=1033&rs=0&ht=0&tfs=107&tls=1140&mc=1<e=0&bas=0&bac=0&met=ce&la=1&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582023716440&dlt&rpt=344&isd=0&msd=0&ext&phel=1&phell=1&xdi=0&ps=1603%2C12909&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-12-2-11-11-0-0-0&tvt=1139&is=970%2C250&iframe_loc=https%3A%2F%2Fwww.golem.de%2F&r=v&id=osdim&vs=4&uc=12&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200210
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame A4A5
|
42 B
116 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstfCvkM8H4-d7j2v9G4E5YwBFSwwhwOk9mAmLBGpPJsk1lhVbGqwpFjB_lmlGN15vKnXbsliNwbqJdhd0QN4ghYtFczcnw4Ve_5wkgudFQ&sig=Cg0ArKJSzETtgfVz15AiEAE&adk=2740773112&tt=-1&bs=1585%2C1185&mtos=0,0,1018,1018,1224&tos=0,0,1018,0,206&p=1048,993,1298,1293&sbeos=0&mcvt=1018&rs=0&ht=0&tfs=102&tls=1326&mc=0.54<e=0&bas=0&bac=0&met=ce&avms=nio&exg=1&md=2&btr=0&lm=2&rst=1582023716445&dlt&rpt=396&isd=0&msd=0&ext&phel=1&phell=1&xdi=0&ps=1603%2C12909&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-14-2-13-13-0-0-0&tvt=1326&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.golem.de%2F&r=v&id=osdim&vs=4&uc=14&upc=1&tgt=DIV&cl=1&cec=1&wf=0&cac=1&cd=0x0&itpl=19&v=20200210
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame F7EC
|
42 B
116 B
|
16ms
15ms
|
Image
image/gif |
2a00:1450:4001:806::2002
GOOGLE
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjst_tTKL4h6YfszH3q7y1M0S42CQPXuKToRRHXq1cxBxQ7sMoAQQ7_YF3Eq1N5X5EDa747Fc4G-HQDIrnDG5vrGzzJMhZ_1scHMAGUznRfJhUm1dtpB6GpAXLYLssg&sai=AMfl-YRZXflVy6tL9Be7FKEL5Fmd3qx-qVuHOVGU8XTKpX9b8_vec2dkhYR2Lw-rNCDZrA7Se5VSOxES_uRyzsYmvZzJEgLmIcry-AZXNvXQ&sig=Cg0ArKJSzIyH6Ox1kPl8EAE&id=ampim&o=993,1048&d=300,250&ss=1600,1200&bs=1600,1200&mcvt=1001&mtos=0,0,1001,1001,1001&tos=0,0,1001,0,0&tfs=138&tls=1139&g=54.79999780654907&h=54.79999780654907&tt=1139&r=v&adk=2838689593&avms=ampa
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
data
lb3.s400.meetrics.net/
|
43 B
308 B
|
33ms
31ms
|
Image
image/gif |
136.243.3.206
HETZNER-AS
|
|
General
- Full URL
- https://lb3.s400.meetrics.net/data?/3LdXKLOBALlnFFUkzFjCPuAAAAAAAABCYkAPAAAFAACYkTCDTAPBAAhPA3DBBCDTAZBAAOA55A55A85B55A58E55A55AGAx0A45A50ArCDTAPiAAhPAYQAHTfPAPBAAhPA3DBICDTAPAAAYGA7ZAIbosAPAAA0EAMCAHl5/APpjAsEA6DAMTfPASksFFGjAAAAAAAAAAAAEAAACYkAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdhPA3DBtEA6DAFAAACDTAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjF9FHATA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.3.206
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h213.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
102ms
34ms
|
XHR
text/javascript |
188.40.115.111
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:7]&s=6acc7c777cce3be138a245218c439c54&1582023725512
- 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.115.111
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.111.115.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|