GET
H/1.1
|
200
OK
|
Primary Request
Cookie set
/
Show response
www.golem.de/
Redirect Chain
-
http://golem.de/
-
https://www.golem.de/
|
188 KB
43 KB
|
161ms
42ms
|
Document
text/html |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_130-min.css
www.golem.de/staticrl/styles/
|
73 KB
20 KB
|
78ms
41ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
metaTag.min.js
Show response
cdn.stroeerdigitalgroup.de/metatag/live/ctc_golem/
|
249 KB
61 KB
|
220ms
178ms
|
Script
application/javascript |
2a02:26f0:6c00:18a::5f76
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
logo-g.png
www.golem.de/staticrl/images/
|
4 KB
4 KB
|
119ms
40ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
143433-209336-209334_rc.jpg
www.golem.de/1909/
|
17 KB
17 KB
|
119ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144125-210038-210035_rc.jpg
www.golem.de/1909/
|
8 KB
9 KB
|
87ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144124-210042-210039_rc.jpg
www.golem.de/1909/
|
12 KB
13 KB
|
61ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144082-209827-209826_rc.jpg
www.golem.de/1909/
|
7 KB
7 KB
|
49ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144122-210025-210024_rc.jpg
www.golem.de/1909/
|
4 KB
4 KB
|
60ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144090-209944-209941_rc.jpg
www.golem.de/1909/
|
7 KB
7 KB
|
65ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
gif
cpxl.golem.de/
|
43 B
292 B
|
59ms
15ms
|
Image
image/gif |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
the-last-of-us-part-ii-8211-trailer.jpg
video.golem.de/teaser/1/1/23539/thumb-high-1000/
|
119 KB
119 KB
|
60ms
16ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
maxresdefault.jpg
video.golem.de/teaser/1/1/23540/thumb-high-1000/
|
144 KB
144 KB
|
43ms
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
|
144026-209581-209580_rc.jpg
www.golem.de/1909/
|
89 KB
89 KB
|
45ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
142430-201810-201807_rc.jpg
www.golem.de/1907/
|
112 KB
112 KB
|
42ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
190923-golem_Seminar_Zeitmanagment_m.jpg
www.golem.de/_img/
|
144 KB
144 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_main_114-min.js
Show response
www.golem.de/staticrl/scripts/
|
100 KB
41 KB
|
43ms
41ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
longread-swiper_131-min.js
Show response
www.golem.de/staticrl/scripts/
|
2 KB
1 KB
|
44ms
42ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
account_js_dt18_1_0.php
Show response
www.golem.de/abo/
|
88 B
576 B
|
73ms
40ms
|
Script
application/javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sdcv.js
Show response
ads.golem.de/
|
63 B
402 B
|
60ms
15ms
|
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/
|
34 KB
11 KB
|
101ms
34ms
|
Script
application/javascript |
91.215.100.39
INFONLINE-AS
|
|
|
GET
H2
|
200
|
gpt.js
Show response
securepubads.g.doubleclick.net/tag/js/
|
44 KB
14 KB
|
208ms
75ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
274 KB
84 KB
|
122ms
46ms
|
Script
application/javascript |
143.204.214.67
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
128ms
53ms
|
Script
text/javascript |
2.18.233.67
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
dmp
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://tracking.m6r.eu/sync/dmp
-
https://tracking.m6r.eu/sync/dmp?checkcookies=true
|
97 B
600 B
|
65ms
64ms
|
XHR
application/json |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
rc
Show response
si.nuggad.net/
|
2 KB
1 KB
|
247ms
53ms
|
Script
text/javascript |
80.82.201.88
UNBELIEVABLE-AS
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
|
22 KB
22 KB
|
43ms
42ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
|
22 KB
22 KB
|
40ms
39ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
|
21 KB
21 KB
|
40ms
39ms
|
Font
application/octet-stream |
77.247.84.129
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
|
40ms
39ms
|
Font
application/octet-stream |
77.247.84.129
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
H/1.1
|
200
OK
|
btn-follow-sp4b.png
www.golem.de/staticrl/images/
|
3 KB
3 KB
|
40ms
39ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
|
26 KB
26 KB
|
43ms
42ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
100 KB
35 KB
|
19ms
19ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
golem_csi-121-min.js
Show response
www.golem.de/staticrl/scripts/adsense/
|
2 KB
1 KB
|
44ms
43ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
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
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=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&...
-
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+City+of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&vr=4...
|
0
694 B
|
38ms
38ms
|
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+City+of&cb=0010&i2=0010f1c16c0da27aa5d8d2aae&ep=1600336797&vr=415&id=sxnjyl&i3=0010f1c16c0da27aa5d8d2aae%3A1598908591323%3A1569532591323%3A.golem.de%3A1%3Agolem%3AGHOME%3Anoevent%3A1569532591323&n1=1&dntt=0<=1569532591324&ev=&cs=s52021&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.05.0 002b
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
IjvnOpbzskTW
Show response
cdn.onthe.io/io.js/
|
72 KB
27 KB
|
377ms
54ms
|
Script
text/javascript |
142.93.164.12
DigitalOcean
|
|
|
GET
H2
|
200
|
js
Show response
www.googletagmanager.com/gtag/
|
69 KB
27 KB
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:814::2008
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
146005_67aa4bdf07fc8a6dd839add1ec7302a1
Show response
lib.selfcampaign.com/tag/
|
10 KB
4 KB
|
150ms
67ms
|
Script
text/javascript |
148.251.131.173
HETZNER-AS
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
36ms
6ms
|
Script
application/javascript |
2600:9000:20bb:a200:15:efbc:e300:93a1
Amazon.com
|
|
|
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
|
43ms
43ms
|
XHR
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
golem_cpxl_113-min.js
Show response
www.golem.de/staticrl/scripts/
|
8 KB
4 KB
|
43ms
42ms
|
Script
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
11promax2-snap.jpg
video.golem.de/teaser/1/1/23531/thumb-high-1000/
|
75 KB
75 KB
|
17ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
bmw-x6-series-in-vanta-schwarz-der-dunkelsten-moeglichen-lackierung.jpg
video.golem.de/teaser/1/1/23525/thumb-high-1000/
|
51 KB
51 KB
|
17ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
quest-snap.jpg
video.golem.de/teaser/1/1/23553/thumb-high-1000/
|
58 KB
58 KB
|
33ms
15ms
|
Image
image/jpeg |
2a00:13c8:f5::f:4b3d:175
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144123-210029-210026_rc.jpg
www.golem.de/1909/
|
11 KB
12 KB
|
41ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144112-209979-209976_rc.jpg
www.golem.de/1909/
|
8 KB
9 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144108-209957-209954_rc.jpg
www.golem.de/1909/
|
4 KB
5 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144121-210019-210018_rc.jpg
www.golem.de/1909/
|
8 KB
9 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144106-209949-209946_rc.jpg
www.golem.de/1909/
|
8 KB
8 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
143888-208882-208878_rc.jpg
www.golem.de/1909/
|
107 KB
108 KB
|
42ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144120-210007-210006_rc.jpg
www.golem.de/1909/
|
9 KB
9 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144099-209904-209900_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144118-210014-210011_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
39ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144071-209783-209779_rc.jpg
www.golem.de/1909/
|
8 KB
9 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144086-209840-209839_rc.jpg
www.golem.de/1909/
|
8 KB
8 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144119-210005-210002_rc.jpg
www.golem.de/1909/
|
8 KB
9 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144114-209993-209990_rc.jpg
www.golem.de/1909/
|
9 KB
9 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144116-210001-209998_rc.jpg
www.golem.de/1909/
|
7 KB
7 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144054-209699-209696_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144062-209732-209729_rc.jpg
www.golem.de/1909/
|
8 KB
9 KB
|
44ms
43ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144113-209984-209981_rc.jpg
www.golem.de/1909/
|
3 KB
3 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144111-209975-209972_rc.jpg
www.golem.de/1909/
|
9 KB
10 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144110-209971-209966_rc.jpg
www.golem.de/1909/
|
5 KB
6 KB
|
41ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144109-209965-209962_rc.jpg
www.golem.de/1909/
|
7 KB
7 KB
|
41ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144095-209882-209879_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
43ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144105-210044-210043_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144107-209953-209950_rc.jpg
www.golem.de/1909/
|
12 KB
12 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144104-209929-209928_rc.jpg
www.golem.de/1909/
|
9 KB
9 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144103-209920-209917_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144064-209741-209738_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
43ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
143951-209924-209921_rc.jpg
www.golem.de/1909/
|
6 KB
6 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
144073-209789-209788_rc.jpg
www.golem.de/1909/
|
7 KB
7 KB
|
41ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143339-206175-206173_rc.jpg
www.golem.de/1909/
|
16 KB
16 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143931-209149-209147_rc.jpg
www.golem.de/1909/
|
28 KB
29 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143856-208699-208697_rc.jpg
www.golem.de/1909/
|
29 KB
29 KB
|
42ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143883-209167-209165_rc.jpg
www.golem.de/1909/
|
21 KB
22 KB
|
39ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143693-209143-209141_rc.jpg
www.golem.de/1909/
|
22 KB
22 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143579-207305-207303_rc.jpg
www.golem.de/1909/
|
20 KB
20 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143337-206210-206208_rc.jpg
www.golem.de/1909/
|
22 KB
22 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143869-209035-209033_rc.jpg
www.golem.de/1909/
|
17 KB
18 KB
|
39ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143911-209045-209043_rc.jpg
www.golem.de/1909/
|
18 KB
18 KB
|
43ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143887-208904-208902_rc.jpg
www.golem.de/1909/
|
20 KB
20 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_141916-205507-205505_rc.jpg
www.golem.de/1909/
|
24 KB
25 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143756-209089-209087_rc.jpg
www.golem.de/1909/
|
18 KB
19 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143919-209014-209012_rc.jpg
www.golem.de/1909/
|
25 KB
25 KB
|
43ms
42ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143908-208983-208979_rc.jpg
www.golem.de/1909/
|
17 KB
18 KB
|
40ms
39ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_143804-208899-208897_rc.jpg
www.golem.de/1909/
|
26 KB
26 KB
|
40ms
40ms
|
Image
image/jpeg |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
cpx.php
cpx.golem.de/
|
42 B
420 B
|
460ms
40ms
|
Image
image/gif |
77.247.84.149
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
18ms
17ms
|
Script
application/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.com/adsid/
|
109 B
171 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- 0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
|
156 KB
57 KB
|
74ms
74ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
arj
Show response
yieldlove-d.openx.net/w/1.0/
|
11 KB
11 KB
|
188ms
147ms
|
XHR
application/json |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://yieldlove-d.openx.net/w/1.0/arj?ju=https%3A%2F%2Fwww.golem.de%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-120&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=b49401bf-5b42-44e9-87a9-9741f6455268%2Cef3a7607-7981-4975-82c8-3e65ddc05bc3%2Ce9a0f925-cd6c-40a4-a103-4cdb7b6e608a%2Ccc9a537a-e5cb-4e25-983c-8e6a74627a16%2C59dea03d-47ca-42aa-adb4-55ff45151a7b&nocache=1569532591397&aus=300x250%7C300x600%2C160x600%2C120x600%2C200x600%2C301x601%7C300x600%2C300x250%7C970x250%2C970x90%2C800x250%2C728x90%7C970x250%2C970x90%2C800x250%2C728x90&divIds=rectangle2%2Csky%2Crectangle%2Cbanner%2Cbillboard2&auid=540523394%2C540523392%2C540523393%2C540523387%2C540651907&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.163.0 /
- Resource Hash
- 8f71ee3131396059a7ce4ea2285bdf44944d113039168046e56f5397342d634c
|
GET
H2
|
200
|
/
Show response
adx.adform.net/adx/
|
10 B
407 B
|
194ms
112ms
|
XHR
application/json |
37.157.4.40
ADFORM
|
|
General
- Full URL
- https://adx.adform.net/adx/?rp=4&bWlkPTcxNDQ0MyZ0cmFuc2FjdGlvbklkPWVmM2E3NjA3LTc5ODEtNDk3NS04MmM4LTNlNjVkZGMwNWJjMw%3D%3D&bWlkPTcxNDQ0NCZ0cmFuc2FjdGlvbklkPWNjOWE1MzdhLWU1Y2ItNGUyNS05ODNjLThlNmE3NDYyN2ExNg%3D%3D&pt=gross&stid=8ec1d207-0c3e-4bd7-ad54-81554b1ace94&fd=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
37.157.4.40
, Denmark,
ASN198622
(ADFORM, DK),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- 78f4a3114e3738eab1ffd31cbd3611435034197ecc40456f3ed43f82af4393d3
|
POST
H2
|
204
|
v1
Show response
dmx.districtm.io/b/
|
0
397 B
|
154ms
111ms
|
XHR
text/plain |
104.16.190.66
Cloudflare
|
|
General
- Full URL
- https://dmx.districtm.io/b/v1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.190.66
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
249ms
141ms
|
XHR
application/json |
69.173.144.141
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349738&size_id=15&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=b49401bf-5b42-44e9-87a9-9741f6455268&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.834999949319484
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.141
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- e44bcc635acacf68bb36e748a30962fcb6608ddf2b052ed7aec5b3e3eaceb02f
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
3 KB
3 KB
|
262ms
154ms
|
XHR
application/json |
69.173.144.141
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1218740&size_id=9&alt_size_ids=8%2C10%2C126&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=ef3a7607-7981-4975-82c8-3e65ddc05bc3&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.29433581531074604
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.141
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- 4a16db7713ec94f2f9b11c587fa12f4c89c84097b10a542293c0da1d229e2371
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
253ms
137ms
|
XHR
application/json |
69.173.144.141
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349732&size_id=15&alt_size_ids=10&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=e9a0f925-cd6c-40a4-a103-4cdb7b6e608a&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.835436736823743
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.141
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- d1f113f4227720d00bfd0f59c290c95f3a56201167663e0864b7658d6bb7ac5c
|
GET
H/1.1
|
200
OK
|
fastlane.json
Show response
fastlane.rubiconproject.com/a/api/
|
241 B
2 KB
|
248ms
128ms
|
XHR
application/json |
69.173.144.141
The Rubicon Project
|
|
General
- Full URL
- https://fastlane.rubiconproject.com/a/api/fastlane.json?account_id=16728&site_id=241806&zone_id=1349674&size_id=2&alt_size_ids=55%2C57%2C125&p_pos=unknown&rf=https%3A%2F%2Fwww.golem.de%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=cc9a537a-e5cb-4e25-983c-8e6a74627a16&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6480901518076088
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_128_GCM
- Server
-
69.173.144.141
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
RAS 2.4 /
- Resource Hash
- 62d19b29386236267f264d98258a648c4f402fdf4c67d12140cf354f9d926af2
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
319 B
|
183ms
47ms
|
XHR
application/json |
185.86.138.79
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
319 B
|
184ms
47ms
|
XHR
application/json |
185.86.138.79
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
319 B
|
193ms
48ms
|
XHR
application/json |
185.86.138.79
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
v1
Show response
prg.smartadserver.com/prebid/
|
0
319 B
|
194ms
50ms
|
XHR
application/json |
185.86.138.79
SMARTADSERVER
|
|
|
POST
H/1.1
|
200
OK
|
prebid
Show response
ib.adnxs.com/ut/v3/
|
483 B
1 KB
|
98ms
46ms
|
XHR
application/json |
185.33.223.83
AppNexus
|
|
|
GET
H/1.1
|
200
OK
|
cygnus
Show response
as-sec.casalemedia.com/
|
25 B
902 B
|
149ms
78ms
|
XHR
application/json |
2.18.234.21
Akamai Technologies
|
|
General
- Full URL
- https://as-sec.casalemedia.com/cygnus?s=335654&v=7.2&r=%7B%22id%22%3A%2230f1e8ad3702df5%22%2C%22imp%22%3A%5B%7B%22id%22%3A%2231a540d8afd0031%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22335654%22%2C%22sid%22%3A%221%22%7D%7D%2C%7B%22id%22%3A%2232891e93bb6d98b%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%22334a0a04cca8b3a%22%2C%22banner%22%3A%7B%22w%22%3A160%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%2234da05d832225db%22%2C%22banner%22%3A%7B%22w%22%3A120%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%223508c3eb3198fff%22%2C%22banner%22%3A%7B%22w%22%3A200%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%223695c2ae8e09e9d%22%2C%22banner%22%3A%7B%22w%22%3A301%2C%22h%22%3A601%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342742%22%2C%22sid%22%3A%222%22%7D%7D%2C%7B%22id%22%3A%22373d2e53405eb0b%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A600%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2238f505a2bbd2161%22%2C%22banner%22%3A%7B%22w%22%3A300%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342744%22%2C%22sid%22%3A%223%22%7D%7D%2C%7B%22id%22%3A%2239c1a1861314278%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%224000afe46817b54%22%2C%22banner%22%3A%7B%22w%22%3A970%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%2241cde38819db15c%22%2C%22banner%22%3A%7B%22w%22%3A800%2C%22h%22%3A250%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%2C%7B%22id%22%3A%22428b05528c92b0d%22%2C%22banner%22%3A%7B%22w%22%3A728%2C%22h%22%3A90%2C%22topframe%22%3A1%7D%2C%22ext%22%3A%7B%22siteID%22%3A%22342748%22%2C%22sid%22%3A%224%22%7D%7D%5D%2C%22site%22%3A%7B%22page%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%7D%2C%22ext%22%3A%7B%22source%22%3A%22prebid%22%7D%7D&ac=j&sd=1&
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.21
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-21.deploy.static.akamaitechnologies.com
- Software
-
Apache /
- Resource Hash
- 05cc76cf8ecc468b9960df4a8a354a44784d440277c8223994fe29dd2e1ebcc7
|
GET
H/1.1
|
200
OK
|
sp_ojOH-704085_rc.jpg
www.golem.de/5976/
|
68 B
463 B
|
71ms
71ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/
|
227 KB
84 KB
|
26ms
26ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
- 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:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- d7625641666eb0d30c70ca6fa1cac3b0705486578733a364c9eff073045ae084
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/
Frame 1931
|
227 KB
84 KB
|
27ms
27ms
|
Script
text/javascript |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
- 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:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- d7625641666eb0d30c70ca6fa1cac3b0705486578733a364c9eff073045ae084
- 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/r20190924/r20190131/
Frame 7E9C
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/html/r20190924/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:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:80b::200e
Google LLC
|
|
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 - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
submit
lb80.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
150ms
35ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/bb-mx/submit?/wTLZBTAAA0whFo0F0wFz6BvvA33F3uBnvFslFtuBklFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSLBDPAAAAAAAAAOAAAAGBAAAAAAZwSLBDBRksFAQtjFBQ8qSA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
143ms
36ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
api
Show response
tracking.m6r.eu/sync/
Redirect Chain
-
https://cdn.m6r.eu/sync/api
-
https://tracking.m6r.eu/sync/api?checkcookies=true
|
1 KB
1 KB
|
55ms
55ms
|
Script
application/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
rmpslider-rl_131-min.js
Show response
www.golem.de/staticrl/scripts/radiant/
|
21 KB
9 KB
|
43ms
42ms
|
XHR
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
POST
H/1.1
|
204
No Content
|
json
Show response
cpxl.golem.de/
|
0
474 B
|
57ms
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
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
|
57ms
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
|
57ms
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
|
57ms
15ms
|
XHR
text/plain |
2a00:13c8:f5::f:4b3d:181
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
collect
stats.g.doubleclick.net/r/
Redirect Chain
-
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=697807570&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=...
-
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1000541211.1569532592&jid=1825927787&_gid=2066517412.1569532592&gjid=242470550&_v=j79&z=2092728431
|
35 B
102 B
|
19ms
19ms
|
Image
image/gif |
2a00:1450:400c:c00::9a
Google LLC
|
|
General
- Full URL
- https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=1000541211.1569532592&jid=1825927787&_gid=2066517412.1569532592&gjid=242470550&_v=j79&z=2092728431
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:400c:c00::9a
Brussels, Belgium,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=10886400; includeSubDomains; preload |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
110 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:80b::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=697807570&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=1041&_u=IEBAAUAB~&jid=&gjid=&cid=1000541211.1569532592&tid=UA-518800-2&_gid=2066517412.1569532592>m=2ou9i1&z=658753158
- 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 - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- 8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 55D0
|
0
0
|
354ms
354ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=3280156863&adf=2993371392&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591411&bpp=9&bdt=698&fdt=123&idt=124&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=3010648819086&frm=20&pv=2&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=53025668992960&dssz=50&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4023&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12333&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.w008apgudsct&fsb=1&xpc=CYCj4zm8OV&p=https%3A//www.golem.de&dtd=139
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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/
|
77 KB
29 KB
|
40ms
40ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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/r20190924/r20190131/show_ads_impl.js?cache=bust
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
395 B
702 B
|
246ms
245ms
|
XHR
text/plain |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1091313496313169&correlator=1755006320471485&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fifs&adsid=NT&eid=20040008%2C21062452%2C21064212%2C21064216&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu_parts=4444%2Cdisp_ctc_golem.de_sd%2Cstartseite&enc_prev_ius=0%2F1%2F2&prev_iu_szs=800x450%7C580x500%7C580x360%7C42x31&prev_scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn3-1%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-noanswer&cookie_enabled=1&bc=31&abxe=1&lmt=1569532591&dt=1569532591577&dlt=1569532590713&idt=846&frm=20&biw=1585&bih=1200&oid=3&adxs=393&adys=2872&adks=3564596220&ucis=1&ifi=5&u_tz=120&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=51&icsg=615975622414272&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x450&msz=1000x450&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&fws=0&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 25cfc5d790d9aca4249fa5b36317cd0679518d62372a32c426d5cd7e9c778e79
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
|
62 KB
24 KB
|
75ms
74ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
60 KB
8 KB
|
605ms
604ms
|
XHR
text/plain |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1091313496313169&correlator=1755006320471485&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fifs&adsid=NT&eid=20040008%2C21062452%2C21064212%2C21064216&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&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%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600%2C20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31%2C10x20%7C10x10%7C300x250%7C300x601%7C300x125%2C20x10%7C20x15%7C30x10%7C30x15%7C40x10%7C40x15%7C80x10%7C80x15%7C100x10%7C100x13%7C770x251%7C800x251%7C970x251%7C32x32%2C10x10%7C10x11%7C301x250%7C300x126&prev_scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26yieldlove_reload%3Dpid%253A17298.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17298.default%26yieldlove_meta%3Dpid%253A17298.sb%253Af%26yieldlove_pid%3D17298%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband%7Cas%3Dbanner%26adslot%3Dbanner%26pc%3D1%26yieldlove_reload%3Dpid%253A17295.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17295.default%26yieldlove_meta%3Dpid%253A17295.sb%253Af%26yieldlove_pid%3D17295%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover%7Cas%3Drectangle%26adslot%3Drectangle%26pc%3D1%26yieldlove_reload%3Dpid%253A17299.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17299.default%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%26yieldlove_reload%3Dpid%253A18494.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A18494.default%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%26yieldlove_reload%3Dpid%253A17300.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A17300.default%26yieldlove_meta%3Dpid%253A17300.sb%253Af%26yieldlove_pid%3D17300%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle2%26af%3Df1x1%2Cmrec&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dsra%26yt%3D0%26adset%3Dbrsl%26nuggad%3Dn3-1%252Cn5-5%252Cn6-2%252Cn7-2%252Cn8-5%252Cn9-0%252Cn10-1%252Cn11-1%252Cn12-6%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn33-4%252Cn38-2%252Cn39-4%252Cn43-3%252Cn44-3%252Cn46-4%252Cn52-2%252Cn57-3%252Cn58-4%252Cn60-3%252Cn62-3%252Cn67-0%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-1%252Cn79-1%252Cn80-0%252Cn81-1%252Cn82-1%252Cn83-0%252Cn84-0%252Cn85-1%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-2%252Cn118-6%252Cn119-3%252Cn120-2%252Cn121-2%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-2%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-2%252Cn90-1%252Cn92-1%252Cn93-3%252Cn94-2%252Cn97-1%252Cn98-1%252Cn99-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn107-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn153-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn157-1%252Cn158-1%252Cn159-1%252Cn160-1%252Cn161-1%26keywords%3Dhomepage%252Ctsilkcalb%252Cnews%252Cweb%252Cinternet%252Cheadlines%252Cnewsletter%252Ctechnology%252Ccomputer%252Cinformation%252Cpc%26mbrStatus%3Dcalled-noanswer&cookie_enabled=1&bc=31&abxe=1&lmt=1569532591&dt=1569532591600&dlt=1569532590713&idt=846&frm=20&biw=1585&bih=1200&oid=3&adxs=1378%2C783%2C1138%2C783%2C1138&adys=0%2C130%2C768%2C1383%2C4419&adks=3744015188%2C2546325955%2C1693156142%2C1158153011%2C3764920871&ucis=3%7C4%7C5%7C6%7C7&ifi=7&u_tz=120&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=52&icsg=2867775436099520&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=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e712b1ffac15cd104dceac573c53b307b08591cb2fea24a56897d0ba5f7c9f98
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
Cookie set
frame
delivery.selfcampaign.com/tag/146005/
Frame B147
|
0
0
|
124ms
46ms
|
Document
text/html |
148.251.131.173
HETZNER-AS
|
|
General
- Full URL
- https://delivery.selfcampaign.com/tag/146005/frame?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
- Requested by
- Host: lib.selfcampaign.com
URL: https://lib.selfcampaign.com/tag/146005_67aa4bdf07fc8a6dd839add1ec7302a1?async=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
148.251.131.173
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.173.131.251.148.clients.your-server.de
- Software
-
nginx/1.14.0 (Ubuntu) /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/506/3014/s/
|
36 KB
13 KB
|
115ms
33ms
|
Script
application/javascript |
89.163.159.106
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
track2.selfcampaign.com/tag/
|
43 B
501 B
|
173ms
37ms
|
Image
image/gif |
148.251.69.233
HETZNER-AS
|
|
General
- Full URL
- https://track2.selfcampaign.com/tag/?request_id=69a09a55-9737-4345-90f6-34f8152875af&_auid=7ca7fab338920cc37f2b2371913d9c27&tag=146005&tags_usergroup=2805&project_id=611&account_id=545&ipzones=&pxs=&_autags=T0T&marked_tags=&lang=en-US&screen=1600x1200&screen_a=1200x1600&color_d=24&location=https%3A//www.golem.de/&referrer=&location_utm_medium=&location_utm_source=&location_utm_campaign=&location_utm_term=&location_utm_content=&title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&meta_keywords=News%2C%20Web%2C%20Internet%2C%20headlines%2C%20newsletter%2C%20technology%2C%20Computer%2C%20web%2C%20information%2C%20pc%2C%20windows%2C%20...&meta_description=Golem.de%20-%20St%C3%A4ndig%20aktuelle%20IT-News%20f%C3%BCr%20Profis%20und%20Videos%20aus%20Politik%2C%20Wirtschaft%20und%20Wissenschaf...
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
148.251.69.233
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.233.69.251.148.clients.your-server.de
- Software
-
nginx/1.9.7 /
- Resource Hash
- cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
|
GET
H/1.1
|
200
OK
|
/
track2.selfcampaign.com/map_td/
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=7ca7fab338920cc37f2b2371913d9c27
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=b2bmedia&ttd_tpi=1&ttd_puid=7ca7fab338920cc37f2b2371913d9c27
-
https://track.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec
-
https://track2.selfcampaign.com/map_td/?tdid=a5885043-912e-4181-985d-0e9fcc5610ec
|
43 B
501 B
|
109ms
37ms
|
Image
image/gif |
148.251.69.233
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
track2.selfcampaign.com/map_td/
Redirect Chain
-
https://c1.adform.net/serving/cookie/match?party=1173
-
https://c1.adform.net/serving/cookie/match?CC=1&party=1173
-
https://track2.selfcampaign.com/map_td/?tdid=4748142316282753057&source=adform
|
43 B
501 B
|
280ms
74ms
|
Image
image/gif |
148.251.69.233
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
mark
lib.selfcampaign.com/tag/146005/
|
0
0
|
59ms
59ms
|
Image
text/plain |
148.251.131.173
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
420ms
121ms
|
XHR
application/json |
52.216.239.181
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
rmp-hcjson.php
Show response
video.golem.de/staticrl/scripts/radiant/
|
291 B
663 B
|
58ms
16ms
|
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
|
54ms
42ms
|
XHR
application/x-javascript |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/bOtueyOKIBMPxa062VVpqqpuUkg/gpt_and_prebid/
|
44 KB
10 KB
|
102ms
33ms
|
Script
text/javascript |
151.101.13.194
Fastly
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 7BD5
|
0
0
|
17ms
16ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&adk=1812271804&adf=3025194257&lmt=1569532591&plat=1%3A32776%2C2%3A32776%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&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=1569532591421&bpp=3&bdt=708&fdt=235&idt=235&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&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=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=2&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.6lpqvdr548gs&fsb=1&dtd=240
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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
|
Cookie set
/
d.agkn.com/iframe/8613/
Frame 39B7
|
0
0
|
136ms
35ms
|
Document
text/html |
3.121.36.175
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=108260985&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.golem.de%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.golem.de%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
- Requested by
- Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
3.121.36.175
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-3-121-36-175.eu-central-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame D0D6
|
0
0
|
237ms
236ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=1011330417&adf=3103571475&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591425&bpp=3&bdt=712&fdt=263&idt=263&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5169&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=2&uci=2.nodi8o8zkvvm&fsb=1&xpc=lUXEfagimf&p=https%3A//www.golem.de&dtd=266
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 6E3C
|
0
0
|
263ms
261ms
|
Document
text/html |
2a00:1450:4001:80b::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=3577236908&adf=700606410&w=520&lmt=1569532591&num_ads=1&guci=1.2.0.0.2.2.0.0&format=520x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1569532591428&bpp=3&bdt=715&fdt=279&idt=279&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=520x120%2C0x0%2C520x120&nras=1&correlator=3010648819086&frm=20&pv=1&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=697807570&ga_fc=0&iag=0&icsg=2463902489644992&dssz=54&mdo=0&mso=0&u_tz=120&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5878&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20040008%2C20040010%2C423550201%2C21064505&oid=3&pg_h=12803&pvsid=874456382727881&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=3&uci=3.ra3xeqszu7b7&fsb=1&xpc=ApZdD7lgoy&p=https%3A//www.golem.de&dtd=282
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js?cache=bust
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:80b::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
311 B
1002 B
|
139ms
37ms
|
XHR
application/json |
143.204.214.52
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
118ms
33ms
|
XHR
text/javascript |
188.40.118.169
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:fd9b28418.a547e73c6_1569532591732,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1569532591735
- 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.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.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
|
127ms
37ms
|
Script
text/html |
188.40.118.169
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
116ms
34ms
|
XHR
text/javascript |
188.40.118.169
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:fd9b28418.a547e73c6_1569532591732,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&__io=fd9b28418.a547e73c6_1569532591732&1569532591737
- 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.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.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
|
124ms
36ms
|
XHR
text/javascript |
188.40.118.169
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:fd9b28418.a547e73c6_1569532591732,cdn_version:7]&s=6acc7c777cce3be138a245218c439c54&1569532591738
- 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.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
vgs.json
Show response
cdn.radiantmediatechs.com/rmp/rr/
|
5 KB
3 KB
|
65ms
22ms
|
XHR
application/json |
2606:4700:20::681a:3cd
Cloudflare
|
|
|
GET
H/1.1
|
200
OK
|
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
|
57 KB
12 KB
|
44ms
44ms
|
Stylesheet
text/css |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_ojOH-220829_rc.jpg
www.golem.de/3473/ad-time/
|
68 B
463 B
|
71ms
71ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
sp_ojOH-804781_rc.jpg
www.golem.de/8203/ad-time/
|
68 B
463 B
|
70ms
70ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
51ms
51ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n3=1&n5=5&n6=2&n7=2&n8=5&n9=0&n10=1&n11=1&n12=6&n17=4&n18=2&n20=2&n21=4&n33=4&n38=2&n39=4&n43=3&n44=3&n46=4&n52=2&n57=3&n58=4&n60=3&n62=3&n67=0&n75=0&n76=1&n77=0&n78=1&n79=1&n80=0&n81=1&n82=1&n83=0&n84=0&n85=1&n86=0&n87=0&n88=1&n117=2&n118=6&n119=3&n120=2&n121=2&n122=1&n123=2&n127=0&n128=2&n135=9&n15=1&n66=1&n89=2&n90=1&n92=1&n93=3&n94=2&n97=1&n98=1&n99=1&n101=1&n104=1&n106=1&n107=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n153=1&n154=1&n155=1&n156=1&n157=1&n158=1&n159=1&n160=1&n161=1
- Requested by
- Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
104.109.82.87
, Netherlands,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a104-109-82-87.deploy.static.akamaitechnologies.com
- Software
-
nginx /
- Resource Hash
- a460dd47416578b87e25489620b5e1a9b247b83b9fc752c327c088d194038279
|
GET
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201909241602/
|
25 KB
10 KB
|
32ms
32ms
|
Script
application/javascript |
151.101.13.194
Fastly
|
|
General
- Full URL
- https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/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 - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 994c75c7c155810e924895ddf706066b1dc59153d7e1697990ba915768c2d669
|
GET
H/1.1
|
200
OK
|
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
|
1 KB
1 KB
|
40ms
40ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
|
924 B
1 KB
|
43ms
42ms
|
Image
image/png |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
|
263 KB
90 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:817::200a
Google LLC
|
|
|
GET
DATA
|
200
OK
|
truncated
/
|
68 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
|
207 KB
60 KB
|
39ms
38ms
|
XHR
application/javascript |
143.204.214.52
Amazon.com
|
|
|
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
|
40ms
39ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
|
15 KB
15 KB
|
40ms
40ms
|
Font
application/octet-stream |
77.247.84.129
SYSELEVEN SysElev...
|
|
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=db8a8c8e52a674ed14f1ecabf02a0091&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Ddb8a8c8e52a674ed14f1ecabf02a0091%2...
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=db8a8c8e52a674ed14f1ecabf02a0091&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Ddb8a8c8e52a674ed14f1ecabf02a0091%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=db8a8c8e52a674ed14f1ecabf02a0091&userId=adscale-user:9664750850da4a7ea349481a66605ec3
|
44 B
528 B
|
47ms
47ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
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=db8a8c8e52a674ed14f1ecabf02a0091
|
43 B
1006 B
|
26ms
26ms
|
Image
image/gif |
185.33.223.83
AppNexus
|
|
|
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=24qMjlKmdO0U8eyr8CoAkQ
-
https://tracking.m6r.eu/sync/adxSyncDone?google_ula=158217889,0
|
44 B
523 B
|
146ms
146ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
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=db8a8c8e52a674ed14f1ecabf02a0091
|
0
495 B
|
129ms
60ms
|
Image
text/plain |
2.16.122.151
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
bridge3.335.0_de.html
imasdk.googleapis.com/js/core/
Frame 7A9B
|
0
0
|
7ms
6ms
|
Document
text/html |
2a00:1450:4001:817::200a
Google LLC
|
|
General
- Full URL
- https://imasdk.googleapis.com/js/core/bridge3.335.0_de.html
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:817::200a
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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
|
98ms
82ms
|
Script
text/javascript |
2a00:1450:4001:81f::2006
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
39ms
38ms
|
XHR
text/javascript |
188.40.118.169
HETZNER-AS
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
|
207 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 5833
|
0
138 B
|
81ms
80ms
|
Fetch
image/gif |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvxi3lbFR_-jY7nybklOmt0OcRElamtYraReZpvrHo1csYvdc3PhnWrZR9LjFpeeYZIjcQm1T9_imqxYNNnDPgF2vFQFNpfvIAPL5TtpndQ6RlsJOiM2ebBAYDIuCZu5wGClSVwHVe6u1QtiDqqAROdNZlenRAF-AliAc2R1TJrQxtOc4sTIKA9Ad5hE-4UtOaZ7M6qI3vc8j1yNCwZHro-YJ8zp72okZagIpoF40TZzEu9vZwb-IM9PesbkpTcFJ0tsYIh4g64gkbeu4Vx5JUREiO1&sai=AMfl-YTQSpySCEFQWxVXmIe75deMMf5lQxVPYz48ox06BUcQPuwBREuVdRkSChLJbD50Lr81DSqhCUBrqIVVOCz5xDQBTcNYMnQP5efT4HFE&sig=Cg0ArKJSzIOtCGRezJODEAE&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.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- 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 5833
|
44 KB
14 KB
|
74ms
73ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 5833
|
78 KB
29 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 4105
|
0
57 B
|
79ms
79ms
|
Fetch
image/gif |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvPbTpSYCe01AMYES9dw5RNTIftr5Dj8r9R66WmlHHOFja-qQpcP1sj38SdSqIZcb5xamm04dOrvML_caFXG4QFoYlyusNzBFYzSDlJmxYOsKj6V4XlqkgzBk25qvD6mcHYVYNJW1z4EpbOtDpKb4L9hdZhXZgB0IPxHSVpIqXCf_xSiq9ReLY_PExK108L7ylkrbhymJd5NXmTSyOCWrnKXz-Ka0DwnYGEceAf6IDCsfDDFr1QgZyEZREm6-jyWEinpbQzW3CsQcRvybftJU1SMmRn&sai=AMfl-YTNIm-e4d6P_6cPRWNkvhUGEH0heUkXy_SdXW7bQOwFydU-TIP6RgHz55XgS88LCyz9A_w28MvI0jGmRzjkx1LBCWCyp7UGTQ6yVpgS&sig=Cg0ArKJSzJjVcpuPBLtGEAE&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.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- 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 4105
|
44 KB
14 KB
|
74ms
74ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 4105
|
78 KB
29 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 98A0
|
0
57 B
|
81ms
81ms
|
Fetch
image/gif |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsubzw7bPZtppTDv6f7-dC7QHcRugA4ehigNJ5E-uvy0Jr9mHwm3m9JCrh7Pr05N78v1upMNnljg4XZ7n9Ws6Kgs66B77E-iucL-SAnCixqt6QxPRIVTtjIaoO8rObo6P6XIyc2K37rHhJNIgzQRwJXHhF1d0NHxOKts_rTZU_OpJ69McG1gLqrJbximpSgQu4I2QkCruk7C07WUi-EGDhQCl7oZeYgEJkDQmZ-Tg-RxUYpT-qWKAaTmCdZq98D63PycWYET_6oDMHMTA1oGDkBrhOJS&sai=AMfl-YQTJPI-74h3RV4nzgXbAObd8gyhE7UZdteirXcJgZer-7wYBaor4aq9c2W5_8ArYm0rVwJRICi2iGKeufca5Sd0gPiJH8pQDVsk0jjq&sig=Cg0ArKJSzB_T7rCKiNf4EAE&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.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- 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 98A0
|
44 KB
14 KB
|
74ms
74ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 98A0
|
78 KB
29 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 1F15
|
0
129 B
|
79ms
78ms
|
Fetch
image/gif |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvxoCfrbUhmxALsuRFNaqfm9GKdGoMfhBW0C9qudo5wtVGmQA1tkgS1v1q0FPDz998P5xqgZiAtkQPX381AW5JHxbcTnHMj1kywqNDUkHMyTffwd3OsybO7isNcEq4sW-TaE2OPEQiJbsOO1BIFUVkflVXBiePKtXl3aU7lM8OZRS8fJfTq9F6hmW-vinCRWz9rkb68gYscSSJzrAn5pk-iBN3VF-PiieRww1s1GzCgCDO166XYIGTLs-MhbHW_Fo1vKdvTDRGk12u7OkZryTu5MRz3&sai=AMfl-YR1X_58WKWXA4AxNNQ21mqZztcpMxlO-v-EsdnGnO6A43D_DFgFj6Vs4JlVXVrIAiLLYpUYAcZSJD57aogn6bMIZsLA8E26w_h2KX3q&sig=Cg0ArKJSzOy4deedC9tEEAE&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.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- 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 1F15
|
44 KB
14 KB
|
73ms
73ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 1F15
|
78 KB
29 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 0FD6
|
0
129 B
|
78ms
77ms
|
Fetch
image/gif |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuhQYlyHmpSPJvMdovq-OfgKjGPkYhUP5IxVu9OxlhifBV4oXiQXZyijbtvjIX5H9VKKwejU0KOat55O_uvYfVH700tygQOWuMN_Wh58j6qK_AKn7vaNt3XNQe9be22JG-TBKtvy9ZUS10jn2OsndPaMt4IJyleY5m_INOFlYJXI0ZrreGvsOymOrN2oDRjZyiCk7WSvw94MfVVXv2W3JDRCVGeAmQqvmYpihkoEBet0OC8A4jr2tfY1UF6SYU5-KMm9UPW1C5Jq7D3hbc1OYILizqZ&sai=AMfl-YTY-5FlLcvU-gde3MK8ceYe_P9VlJ4DF5rRFSSFPcM-mP7MmzLEDvuVJ3v1CIfr3-gAFTNLZRxfX7YPDbvN-5NCkMMiHVpimBSoOSLq&sig=Cg0ArKJSzKgFAYSPk0CqEAE&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.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- 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 0FD6
|
44 KB
14 KB
|
88ms
87ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 0FD6
|
78 KB
29 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 6182dfae0694d2f06ce0ba9e18b21af30bdc62b4878767761059e6f03cba08e5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 5833
|
156 KB
57 KB
|
73ms
73ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame 5833
|
113 B
598 B
|
28ms
16ms
|
Script
application/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.co.uk/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 4105
|
156 KB
57 KB
|
86ms
86ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame 4105
|
113 B
175 B
|
26ms
19ms
|
Script
application/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.co.uk/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 98A0
|
156 KB
57 KB
|
98ms
97ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame 98A0
|
113 B
175 B
|
17ms
17ms
|
Script
application/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.co.uk/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 1F15
|
156 KB
57 KB
|
112ms
110ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame 1F15
|
113 B
175 B
|
17ms
15ms
|
Script
application/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.co.uk/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 0FD6
|
156 KB
57 KB
|
112ms
112ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.co.uk/adsid/
Frame 0FD6
|
113 B
175 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:816::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.co.uk/adsid/integrator.sync.js?domain=www.golem.de
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:816::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- ea03bfd7fdda1eac185ebc3e8e74b33065b04c8e0adc48cbbd4136748dbd2742
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 5833
|
21 KB
9 KB
|
398ms
397ms
|
XHR
text/plain |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=977680051757335&correlator=2549258621441485&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062421&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_300x600_1_dc&sz=10x40%7C10x30%7C10x20%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=adslot%3Dsky%26src%3Dsdg%26yieldlove_pid%3D17298%26yieldlove_targeting%3D%257B%2522adset%2522%253A%255B%2522brsl%2522%255D%252C%2522adslot%2522%253A%255B%2522sky%2522%255D%252C%2522af%2522%253A%255B%2522f1x4%2522%252C%2522f1x3%2522%252C%2522f1x2%2522%252C%2522ds%2522%252C%2522sky%2522%252C%2522hpad%2522%252C%2522band%2522%255D%252C%2522as%2522%253A%255B%2522sky%2522%255D%252C%2522hb_unit%2522%253A%255B%2522sky%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%2522%255D%252C%2522pc%2522%253A%255B%25221%2522%255D%252C%2522rfree%2522%253A%255B%2522200-299%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17298.sb%253Af%2522%255D%252C%2522yieldlove_pid%2522%253A%255B%252217298%2522%255D%252C%2522yieldlove_reload%2522%253A%255B%2522pid%253A17298.reload%253Afalse%2522%255D%252C%2522yieldlove_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17298.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592406&dlt=1569532592216&idt=182&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=2&adx=1303&ady=10&adk=1672853988&uci=ienorn119qws&ifi=1&ifk=2036525376&u_tz=120&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=300x40&msz=300x40&ga_vid=1000541211.1569532592&ga_sid=1569532592&ga_hid=2130446015&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 8cda6ce4297fa9afd2c18bc5b6c82b6e9a9ecb14aa789b4463613f9f3e83ea49
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 5833
|
62 KB
24 KB
|
74ms
73ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 5833
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 5833
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 4105
|
21 KB
9 KB
|
511ms
510ms
|
XHR
text/plain |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3217741005400948&correlator=1989870544897538&output=ldjh&impl=fif&eid=21064124%2C21063635%2C21063817%2C21064507%2C21064520%2C21064592%2C21064678&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_970x250_1_dc&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%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%2522vidwa%2522%252C%2522brabo%2522%252C%2522fufrad%2522%252C%2522floor%2522%252C%2522videoTakeover%2522%255D%252C%2522as%2522%253A%255B%2522banner%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17295.sb%253Af%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_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17295.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592428&dlt=1569532592223&idt=199&ea=0&frm=23&biw=1585&bih=1185&isw=970&ish=250&oid=3&adx=308&ady=140&adk=396647303&uci=ei30kvax3xb7&ifi=1&ifk=1044686037&u_tz=120&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=1000541211.1569532592&ga_sid=1569532592&ga_hid=2122968672&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 63e58a3ac724005ee3e939d07cec69a4baf2306eca48c9fb9ae5649889d653d7
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 4105
|
62 KB
24 KB
|
74ms
73ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 4105
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 4105
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 98A0
|
21 KB
9 KB
|
368ms
367ms
|
XHR
text/plain |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=3801454602102002&correlator=3089965105031568&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21062420%2C21062832%2C21063636&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_300x600_2_dc&sz=10x20%7C10x10%7C300x250%7C300x601%7C300x125&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%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17299.sb%253Af%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_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17299.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592453&dlt=1569532592229&idt=217&frm=23&biw=1585&bih=1185&isw=300&ish=601&oid=3&adx=993&ady=1028&adk=1812355494&uci=22dgu1dlcsoc&ifi=1&ifk=4049690229&u_tz=120&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=1000541211.1569532592&ga_sid=1569532592&ga_hid=1006680154&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 65e86350610343890e1766ad71056f8dbe4b353279ee39fc1adfb49d3d1e38e3
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 98A0
|
62 KB
24 KB
|
74ms
73ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 98A0
|
0
0
|
6ms
6ms
|
Other
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
|
53 B
642 B
|
104ms
103ms
|
XHR
application/json |
52.216.239.181
Amazon.com
|
|
General
- Full URL
- https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=1080057771
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.216.239.181
Ashburn, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., 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
14ms
|
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=8282157263
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- 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
DATA
|
200
OK
|
truncated
/
Frame 98A0
|
212 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 1F15
|
302 B
205 B
|
139ms
139ms
|
XHR
text/plain |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=513223060941822&correlator=3905587765812749&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_970x250_2_dc&sz=20x10%7C20x15%7C30x10%7C30x15%7C40x10%7C40x15%7C80x10%7C80x15%7C100x10%7C100x13%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%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A18494.sb%253Af%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_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A18494.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592490&dlt=1569532592237&idt=247&ea=0&frm=23&biw=1585&bih=1185&isw=770&ish=251&oid=3&adx=408&ady=1643&adk=2366093405&uci=89wf7ctaefcw&ifi=1&ifk=1036748905&u_tz=120&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=1000541211.1569532592&ga_sid=1569532592&ga_hid=1214184772&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 5303e348372628d65a4165215231175c440dc401c1ec826dcee74168436a3dc5
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 1F15
|
62 KB
24 KB
|
74ms
74ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 1F15
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 0FD6
|
300 B
202 B
|
142ms
141ms
|
XHR
text/plain |
172.217.16.194
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=126867689492655&correlator=782557617482829&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A32776%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F53015287%2Fgolem.de_d_300x250_2_dc&sz=10x10%7C10x11%7C301x250%7C300x126&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%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%2522mbrstatus%2522%253A%255B%2522called-noanswer%2522%255D%252C%2522nuggad%2522%253A%255B%2522n3-1%2522%252C%2522n5-5%2522%252C%2522n6-2%2522%252C%2522n7-2%2522%252C%2522n8-5%2522%252C%2522n9-0%2522%252C%2522n10-1%2522%252C%2522n11-1%2522%252C%2522n12-6%2522%252C%2522n17-4%2522%252C%2522n18-2%2522%252C%2522n20-2%2522%252C%2522n21-4%2522%252C%2522n33-4%2522%252C%2522n38-2%2522%252C%2522n39-4%2522%252C%2522n43-3%2522%252C%2522n44-3%2522%252C%2522n46-4%2522%252C%2522n52-2%2522%252C%2522n57-3%2522%252C%2522n58-4%2522%252C%2522n60-3%2522%252C%2522n62-3%2522%252C%2522n67-0%2522%252C%2522n75-0%2522%252C%2522n76-1%2522%252C%2522n77-0%2522%252C%2522n78-1%2522%252C%2522n79-1%2522%252C%2522n80-0%2522%252C%2522n81-1%2522%252C%2522n82-1%2522%252C%2522n83-0%2522%252C%2522n84-0%2522%252C%2522n85-1%2522%252C%2522n86-0%2522%252C%2522n87-0%2522%252C%2522n88-1%2522%252C%2522n117-2%2522%252C%2522n118-6%2522%252C%2522n119-3%2522%252C%2522n120-2%2522%252C%2522n121-2%2522%252C%2522n122-1%2522%252C%2522n123-2%2522%252C%2522n127-0%2522%252C%2522n128-2%2522%252C%2522n135-9%2522%252C%2522n15-1%2522%252C%2522n66-1%2522%252C%2522n89-2%2522%252C%2522n90-1%2522%252C%2522n92-1%2522%252C%2522n93-3%2522%252C%2522n94-2%2522%252C%2522n97-1%2522%252C%2522n98-1%2522%252C%2522n99-1%2522%252C%2522n101-1%2522%252C%2522n104-1%2522%252C%2522n106-1%2522%252C%2522n107-1%2522%252C%2522n114-1%2522%252C%2522n115-1%2522%252C%2522n124-1%2522%252C%2522n125-1%2522%252C%2522n126-1%2522%252C%2522n139-1%2522%252C%2522n153-1%2522%252C%2522n154-1%2522%252C%2522n155-1%2522%252C%2522n156-1%2522%252C%2522n157-1%2522%252C%2522n158-1%2522%252C%2522n159-1%2522%252C%2522n160-1%2522%252C%2522n161-1%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_hb_sucbid%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_meta%2522%253A%255B%2522pid%253A17300.sb%253Af%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_reloaded%2522%253A%255B%2522false%2522%255D%252C%2522yieldlove_reloads%2522%253A%255B%25220%2522%255D%252C%2522yieldlove_scenario%2522%253A%255B%2522default%2522%255D%252C%2522yieldlove_scenario_pid%2522%253A%255B%2522pid%253A17300.default%2522%255D%252C%2522yt%2522%253A%255B%25220%2522%255D%257D&eri=6&cookie=ID%3D3f361bac7bbec044%3AT%3D1569532591%3AS%3DALNI_MZmu28qsdKMv6VHwz1Ihm8N-gDudg&cdm=www.golem.de&bc=31&abxe=1&lmt=1569532592&dt=1569532592503&dlt=1569532592242&idt=255&ea=0&frm=23&biw=1585&bih=1185&isw=301&ish=250&oid=3&adx=993&ady=4510&adk=4292326851&uci=ud9er596z8dy&ifi=1&ifk=4200391111&u_tz=120&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=1000541211.1569532592&ga_sid=1569532593&ga_hid=27540368&fws=256&ohw=0
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.194
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra16s08-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- b7ca2ee955e7631732abb3e869c7a8d409ea414194bb22f7b6da2b5a6700beff
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
pubads_impl_rendering_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 0FD6
|
62 KB
24 KB
|
75ms
74ms
|
Script
text/javascript |
172.217.16.194
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 0FD6
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.golem.de/
|
311 B
993 B
|
39ms
39ms
|
XHR
application/json |
143.204.214.52
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=1145424042
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
143.204.214.52
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-143-204-214-52.fra53.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
|
GET
DATA
|
200
OK
|
truncated
/
Frame 1F15
|
212 B
0
|
|
Image
image/png |
|
|
|
GET
DATA
|
200
OK
|
truncated
/
Frame 0FD6
|
215 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
37ms
37ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/data?/wTLZDDRAAKktFLkqFFlqwF23A52AwwA/k0FVEmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzBELlnFBUkzFYBP5QAAAAAAABNJWAPCAAFAANJWTYeNAPAAAXUAKAABYeNAZCAAOA55A55A85B55A58E55A55AFA5wA3wAxBErYeNASksFqFjAAAAAAAAAAAAEAAANJWAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA23A43Ay2Az4ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A23A24A3xADAzrF5BFKA04A45A23A24A3xAKA04A45A23A24A3xAxAlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEzrF5BFdXUAKAAsEAYJAFAAAYeNAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFN/3NUA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
34ms
34ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/data?/wTLZEPRAA/k0FvImvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AyBELlnFCUkzFYBPFAAAAAAAAB2I8APAAAFAA2I8Tl5/APBAA0EAMCABl5/AZBAAOA55A55A85B55A58E55A55AGAy0A2zAy2Arl5/ASksFwFjAAAAAAAAAAAAEAAA2I8AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA53Aw4Ey1AwBEMAxzA4yA23A13A4wA0wANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A35A34A52AGAihFuuFlyFKA04A45A35A34A52AKA04A45A35A34A52A0AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFd0EAMCAKPA6DAFAAAl5/AAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFn5/YWA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
62ms
37ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/data?/wTLZFPRAA/k0FQNmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AymEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A10ALlnFDTkzFPPKAAAAAAAAB7i2ASksFCFjAAAAAAAAAAAAEAAA7i2AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAw4E2wAxBEMAxzA4yA23A43Ay2A12ANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A24Aw3A00AJAylFj0FhuFnsFlBFKA04A45A24Aw3A00AKA04A45A24Aw3A00A3AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlBFQtjF9sTzYA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/29aef076687345c9c37ca367b8a5451aad4b1991/
|
311 B
1 KB
|
317ms
99ms
|
XHR
application/json |
46.4.49.53
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/29aef076687345c9c37ca367b8a5451aad4b1991/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.49.53
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.53.49.4.46.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- c3964186bc402b2cea9d8275604a36a22703f6a3927011fe1e3116f8e81f47ab
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
47ms
33ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
79ms
37ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/data?/wTLZHkRAA/k0FyRmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AymEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A10AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A31ATkzFARksFAQtjFzaAzZA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
69ms
34ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/data?/wTLZIwRAALlnFEUkzFYBPTAAAAAAAABAD9APAAAFAAAD9TTfPAPAAAYGArZABTfPAZCAAOA55A55A85B55A58E55A55AGAy1AwwA04ArTfPASksF8FjAAAAAAAAAAAAEAAAAD9AAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHA33Aw4Ey1AxBEMAxzA4yA2zA1yA50A5yANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A5wAz3Az0Ay0AKAipFssFivFhyFkyBKA04A5wAz3Az0Ay0AKA04A5wAz3Az0Ay0A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEipFssFivFhyFkyBdYGArZACMA7DAFAAATfPAAAAAJACpFssFivFhyFkBFAAAAAAAAAAAAAAAAQtjFf9/ySA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
71ms
35ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/data?/wTLZJwRAA/k0FaWmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A52A32A43AxmAjpFk9BxzA4yA23A43Ay2Az4AmzEp6Fl9BzwAw4E2wAwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9zEr5FmhEwjF90A44A52A32A43AxmAhwFk9B04A45A23A24A3xAmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGzFr5FmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA1zAzmEvyFthF0jFvkFl9BCpFssFivFhyFkmBhkF29B25Aw1Ax1A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A44A53A53A45A2mAjpFk9BxzA4yA23A13A4wA0wAmzEp6Fl9B53Aw4Ey1AwmAzpF0lF9kEpzFwfFj0FjfFnvFslFtuBklFfzFkmBwsFhjFl9Bz0FhyF0zFlpF0lFmhEwiF9iEhuFulFymBhwFj9B04A45A35A34A52AmhEwkF90A44A53A53A45A2mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEihFuuFlyFmhEkjF9BEkYFtZEplFskFsvF2lFmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A1zAy1A5yA10AymEvyFthF0jFvkFl9BIhFsmFwhFnlFBkFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A24Aw3A00AmjEpkF9xAz4Ay2A34A3yA21A2mAzpF6lF9zAwwA42BwxAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlmBhwFj9B04A45A24Aw3A00AmhEwkF90A44A52A4wA30A0mAhwFl9BlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlmBhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A10AmvFytFh0FjvFklF9CEpsFsiFvhFykFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A5wAz3Az0Ay0AmjEpkF9xAz4Ay2Az1Ay5A05AymAzpF6lF93A3wA4yB1xAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BipFssFivFhyFkyBmhEwjF90A45AwzA3zA0yA0mAhwFk9B04A5wAz3Az0Ay0AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGiFpsFsiFvhFykFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A31AmvFytFh0FjvFklF9NElkFp1FtSFljF0hFunFslFmhEk2F92A5wA1xA11A31AmjEwpFk9BklFzrF0vFwmBhwFh9B04A45A4wAxyA03AmjEpkF9xAz4Ay2A34A3yA23AxmAzpF6lF9zAwxA4yB1wAmzEp0Fl9BkpFzwFfjF0jFfnFvsFltFukElfFzkFmwEshFjlF9zE0hFy0FzlFp0FlmBhwFi9BylFj0FhuFnsFlyBmhEwjF90A44A54AwxAy0A3mAhwFk9B04A45A4wAxyA03AmhEwlF9lAyGE00A00AlyAGkFpzFwfFj0FjfFnvFslFtuBklFfzFklByGEz0FhyF0zFlpF0lFlyAGyFljF0hFunFslFymAhkFj9BBkFYtBZpFlsFksFv2FlmBttFvkFl9BklFmhF1sF0mBjiF9xA12A51AzyA15Ay1A43ATkzFARksFAQtjFKy+MeA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 0FD6
|
0
58 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:815::2002
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 83D4
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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 5833
|
77 KB
29 KB
|
38ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
200
|
hb2.php
Show response
tracking.yieldlove-ad-serving.net/
|
2 B
107 B
|
95ms
31ms
|
XHR
text/plain |
52.28.163.57
Amazon.com
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 706C
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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 98A0
|
77 KB
29 KB
|
39ms
39ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
200
|
hb2.php
Show response
tracking.yieldlove-ad-serving.net/
|
2 B
107 B
|
80ms
31ms
|
XHR
text/plain |
52.28.163.57
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.golem.de/
|
24 B
356 B
|
3406ms
34ms
|
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,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- 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 ACDC
|
241 B
0
|
|
Script
text/javascript |
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame CB9E
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:809::2001
Google LLC
|
|
General
- Full URL
- https://tpc.googlesyndication.com/safeframe/1-0-35/html/container.html?n=1
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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 4105
|
77 KB
29 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::2002
Google LLC
|
|
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_2019091901.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:806::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 218087ed3854e672a6627b47c86b3a97e1dad722daa9f509fe522b33b01302a2
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
204
|
gen_204
pagead2.googlesyndication.com/pagead/
Frame 4105
|
0
58 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_sz&r=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C728x180%7C31x31&w=970&h=250
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
POST
H2
|
200
|
hb2.php
Show response
tracking.yieldlove-ad-serving.net/
|
2 B
107 B
|
34ms
34ms
|
XHR
text/plain |
52.28.163.57
Amazon.com
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 5833
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssqHC8IiKjMQ1_Sd1m2q3qGYY-fNu65nXfkGAwARNKWN5mHm-oSTVwsXoD1Ur-TEC3sLWiS9sUVBlwKanf_dNVfkFNJg-KiS8uTjtWz2wA&sig=Cg0ArKJSzPp0yfKKTFJIEAE&adk=3744015188&tt=-1&bs=1585%2C1185&mtos=0,1038,1038,1038,1038&tos=0,1038,0,0,0&p=10,1303,610,1603&mcvt=1038&rs=3&ht=0&tfs=752&tls=1790&mc=0.94<e=0.94&bas=0&bac=0&met=no&avms=nio&niot_obs=465&niot_cbk=503&md=2&lm=2&rst=1569532592219&rpt=214&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1603%2C12624&ss=1600%2C1200&pt=-1&bin=1&deb=1-4-9-22-18-14-166-16-0-0-0&tvt=1785&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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 4105
|
42 B
110 B
|
15ms
15ms
|
Image
image/gif |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsuV65mn_49gZwkDCh1_l7skG4ksxZ80rla759phQOZ_ebCFJZHefIgektyf5_GCsmDNuPWKosGlrE-ise4kfdHUwS4IUysELoMSPbgPMkI&sig=Cg0ArKJSzCACdJIl-5z9EAE&adk=2546325955&tt=-1&bs=1585%2C1185&mtos=1038,1038,1038,1038,1038&tos=1038,0,0,0,0&p=140,308,390,1278&mcvt=1038&rs=3&ht=0&tfs=752&tls=1790&mc=1<e=1&bas=0&bac=0&met=no&la=1&avms=nio&niot_obs=471&niot_cbk=503&md=2&lm=2&rst=1569532592225&rpt=233&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1603%2C12624&ss=1600%2C1200&pt=-1&bin=1&deb=1-4-9-22-18-14-166-16-0-0-0&tvt=1785&r=v&id=osdim&vs=4&za&uc=11&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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 98A0
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:815::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjssJKN3q1_tOp7dM_r-rZXkjYHxKXASU5Eqax1ec4FM5rbG7b8DrvpPgkNBFyYdZfoQvgpKkM2PsyYK1n8h1FcumeBP-oxWWyqttKCTKY48&sig=Cg0ArKJSzPHdI-gPHPNmEAE&adk=1693156142&tt=-1&bs=1585%2C1185&mtos=0,0,1047,1047,1361&tos=0,0,1047,0,314&p=1028,993,1278,1293&mcvt=1047&rs=3&ht=0&tfs=856&tls=2217&mc=0.62<e=0.26&bas=0&bac=0&met=no&avms=nio&niot_obs=477&niot_cbk=503&md=2&lm=2&rst=1569532592231&rpt=281&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1603%2C12624&ss=1600%2C1200&pt=-1&bin=1&deb=1-4-9-36-22-14-202-20-0-0-0&tvt=2211&r=v&id=osdim&vs=4&za&uc=15&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
- Requested by
- Host: www.golem.de
URL: https://www.golem.de/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, 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
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
47ms
47ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
usync.html
eus.rubiconproject.com/
Frame FB0F
|
0
0
|
95ms
31ms
|
Document
text/html |
23.37.55.184
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/
Frame 42ED
|
0
0
|
356ms
34ms
|
Document
text/html |
151.101.13.108
Fastly
|
|
General
- Full URL
- https://acdn.adnxs.com/ib/static/usersync/v3/async_usersync.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.13.108
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.9.13 /
- Resource Hash
|
GET
H2
|
200
|
index.html
cdn.districtm.io/ids/
Frame 11EC
|
0
0
|
107ms
106ms
|
Document
text/html |
104.16.190.66
Cloudflare
|
|
General
- Full URL
- https://cdn.districtm.io/ids/index.html
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
104.16.190.66
, United States,
ASN13335
(CLOUDFLARENET - Cloudflare, Inc., US),
- Reverse DNS
- Software
-
cloudflare /
- Resource Hash
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000; includeSubDomains; preload |
|
GET
H2
|
200
|
pd
eu-u.openx.net/w/1.0/
Frame 401E
|
0
0
|
29ms
27ms
|
Document
text/html |
34.95.120.147
Google LLC
|
|
General
- Full URL
- https://eu-u.openx.net/w/1.0/pd?plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
- Requested by
- Host: cdn-a.yieldlove.com
URL: https://cdn-a.yieldlove.com/yieldlove-bidder-stroeer.js?golem.de
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.95.120.147
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 147.120.95.34.bc.googleusercontent.com
- Software
-
OXGW/16.163.0 /
- Resource Hash
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/d374a36aafa243c04839fb55c0ef890dad48023b/
|
110 B
670 B
|
534ms
40ms
|
XHR
application/json |
46.4.49.53
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/d374a36aafa243c04839fb55c0ef890dad48023b/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.49.53
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.53.49.4.46.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/f94c2c9484ddd54f6d6b6dd3781b8e78b3ffa0ba/
|
111 B
671 B
|
493ms
39ms
|
XHR
application/json |
46.4.49.53
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/f94c2c9484ddd54f6d6b6dd3781b8e78b3ffa0ba/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.49.53
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.53.49.4.46.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- ad943d6e6dbcf798423ad954e6f7025c2b3aec3efd5bd199c93dbcf72ca593b5
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.golem.de/c0cd335bfce67ff105c1f1ec2d0be0ee83a44eed/
|
110 B
670 B
|
205ms
39ms
|
XHR
application/json |
46.4.49.53
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.golem.de/c0cd335bfce67ff105c1f1ec2d0be0ee83a44eed/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIFZvY2hhaXZham9vbGFpVGg9Vm9jaGFpdmFqb29sYWlUaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuWmV8fCh5LlplPTApO3kuWmUrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5aZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5hYihhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHJjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5RbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLncoay5mZCxjLnUoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlVhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EubmYoYyk7YS53dShsKTthLnZ1KG0pO2EuaHUoKTthLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLktiLmxlbmd0aCl7dmFyIGE9bC5LYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5FdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5zaC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuc2goaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2w9dGhpcy5hWzVdO3RoaXMubGw9dGhpcy5hWzFdO3RoaXMuY2s9dGhpcy5hWzVdO3RoaXMucHc9dGhpcy5hWzEwXTt0aGlzLmhsPXRoaXMuYVs5XTt0aGlzLlR2PXRoaXMuYVszXTt0aGlzLkZxPXRoaXMuYVs1XTt0aGlzLkZwPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzFdfWMuTXA9YjtiLnByb3RvdHlwZT17Rmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkdsOnRoaXMua2woYSl9LGtsOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMubGw6dGhpcy5iayhhKX0sYms6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmNrOnRoaXMub3coYSl9LG93OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5wdzoKdGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmhsOnRoaXMuU3YoYSl9LFN2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Udjp0aGlzLkVxKGEpfSxFcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRnE6dGhpcy5FcChhKX0sRXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkZwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgaGE9Yy5NcHx8aGEsc2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9c2MuRmwoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuUW89ITE7dGhpcy4kYj0ic2V0dXAiO3RoaXMuUGM9W107dGhpcy5zZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlF0LmJpbmQodGhpcykpOwp0aGlzLnBiPXt9O3RoaXMuJGc9e307dGhpcy5rZj0hMTt0aGlzLkJjPXRoaXMuRGM9IiI7dGhpcy55ZT10aGlzLkRnPXRoaXMuQ2c9ITF9Yy5qaz1iO2IucHJvdG90eXBlPXtidjpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5wYil0aGlzLnBiLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLnBiW2JdKyJfIik7cmV0dXJuIGF9LFliOmZ1bmN0aW9uKCl7dGhpcy5rZnx8KHRoaXMua2Y9ZS5hYSgxMCkpO3JldHVybiB0aGlzLmtmfSxxYjpmdW5jdGlvbihhKXt0aGlzLnBiW2FdfHwodGhpcy5wYlthXT0wKTt0aGlzLnBiW2FdKz0xOzU8dGhpcy5wYlthXSYmIXRoaXMuJGdbYV0mJih0aGlzLiRnW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLHRoaXMuYnYoKSwhMCkpfSxzZTpmdW5jdGlvbigpe3RoaXMuYmE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sCmdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sQm46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LFF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLlB0KGEuZGF0YSl9LFB0OmZ1bmN0aW9uKGEpe2lmKHRoaXMuYmEmJnRoaXMuYmEuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGI9dGhpcy5iYS5ldmVudGxpc3RlbmVyLmxlbmd0aCxkPTA7ZDxiO2QrKyl0aGlzLmJhJiYKdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGxlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LHZnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuUGcoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLnhkKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxQZzpmdW5jdGlvbihhKXt2YXIgYj1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYj1iLmV4ZWMoYSkpJiYoYlsyXXx8CmJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sem46ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy54YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLkdxKGEpKXJldHVybjsoYj10aGlzLnZnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT1hfX0sR3E6ZnVuY3Rpb24oYSl7dmFyIGI9ITE7dGhpcy5iYS5ob21hZFVybHNbYV0mJihiPXRoaXMuYmEuaG9tYWRVcmxzW2FdKTtyZXR1cm4gYn0sRmc6ZnVuY3Rpb24oYSl7dmFyIGI9CiExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxoYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LGhzOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LERlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sT2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFdoOmZ1bmN0aW9uKGEpe2Zvcig7YSE9CmRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxraDpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCxlPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIGc9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKaWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZiYmKGY9MCk7MD5kJiYoZD0wKTswPHEmJihjPTEwMC9xKmQqZik7Yz49YiYmKGU9ITApO3JldHVybiBlfSxMZTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLktlKGEuZWwsYS5wZXJjZW50KTthLnN0YXJ0VGltZXx8CihhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MZShhKX0uYmluZCh0aGlzKSwxMDApfSxJYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0sRmU6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLApmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9MDtmPG4tMztmKz00KXE9YS5jaGFyQ29kZUF0KGYpPDwyNHxhLmNoYXJDb2RlQXQoZisxKTw8MTZ8YS5jaGFyQ29kZUF0KGYrMik8PDh8YS5jaGFyQ29kZUF0KGYrMyksdC5wdXNoKHEpO3N3aXRjaChuJTQpe2Nhc2UgMDpmPQoyMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtxPWU7bj1nO3g9azt1PWw7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSwKbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrYihnKStiKGspK2IobCkrYihtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixxLGMsZSxnLGs9MDtrPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChrKyspLGY9YS5jaGFyQ29kZUF0KGsrKyksCnE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7cmV0dXJuIGJ9LGRzOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0sCmxkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5UYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0hZyYmISF3aW5kb3cuU3R5bGVNZWRpYXx8Ci0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxWYTpmdW5jdGlvbigpe3ZhciBhPXtkajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxtajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSx4cjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSx6bDpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSwKT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LFRrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sYm06ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxBbzpmdW5jdGlvbigpe3JldHVybiBhLmRqKCl8fGEubWooKXx8YS54cigpfHxhLnpsKCl8fGEuT20oKXx8YS5UaygpfHxhLmJtKCl9fTtyZXR1cm4gbnVsbCE9YS5BbygpfSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEdjOmZ1bmN0aW9uKGEpe2E9dGhpcy54YShhKS5ob3N0LnNwbGl0KCIuIik7dmFyIGI9IiI7YVthLmxlbmd0aC0yXSYmKGIrPWFbYS5sZW5ndGgtMl0rIi4iKTthW2EubGVuZ3RoLTFdJiYoYis9YVthLmxlbmd0aC0xXSk7cmV0dXJuIGJ9LHRhOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGI9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LGJyOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMueGEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSx3cDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgZD1bXSxmPVtdLHE9MDtxPGIubGVuZ3RoO3ErKylkW2JbcV1dPSEwO2ZvcihxPTA7cTxhLmxlbmd0aDtxKyspZFthW3FdXXx8Zi5wdXNoKGFbcV0pO3JldHVybiBmfSxXdTpmdW5jdGlvbihhLGIpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8YS5pbmRleE9mKCIlIikmJjA8Yj8oZj1hLnNwbGl0KCIlIiksZD1iLzEwMCpmKTooZD1hLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxLZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMua2koYikrIjoiK3RoaXMua2koTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LGtpOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxtZjpmdW5jdGlvbihhKXt0aGlzLiRiPWF9LEhnOmZ1bmN0aW9uKGEsYixkKXt2YXIgZjtkLnN0YXRlPXRoaXMuJGI7dGhpcy5pZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpOwphLmRpc3BhdGNoRXZlbnQoZil9LEVjOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5IZyhkLGIsYSl9LHc6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLlRhKGIsZCkpO2ImJihCPWsuVGEoYSxiKSk7ZiYmKEI9ay5UYShCLGYpKTtxJiYoQj1rLlRhKEIscSkpO2MmJihCPWsuVGEoQixjKSk7ZyYmKEI9ay5UYShCLGMpKTtlLkVjKEIpfSxTdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmMTAwNTw9YS5jb2RlJiYxMDI5Pj1hLmNvZGUpfHwxMDIzPT1hLmNvZGV8fDEwMTg9PWEuY29kZSlyZXR1cm47dHJ5e2lhJiYoYi5zZXNzaW9uX2lkPWlhKTtiLmFkc2Vzc2lvbl9pZD1hLmFkc2Vzc2lvbl9pZD9hLmFkc2Vzc2lvbl9pZDoiZXBvbiI7YS5ob21hZEltcHJlc3Npb25BZElkJiYoYi5hZF9pZD1hLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwpiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLmJyKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sWHU6ZnVuY3Rpb24oYSl7YS5zcGVjaWFsX3RyYWNrPSEwO2Euc2Vzc2lvbl9pZD10aGlzLlliKCk7YS5ldmVudF9jb2RlfHwoYS5ldmVudF9jb2RlPTk5OTAwKTthLmNvZGU9YS5ldmVudF9jb2RlO2EuZXZlbnRfbmFtZXx8KGEuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5pZShhKX0saWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5TdChhKTtpZihiKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5pZShiKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuRmQoKTtsLnphKGEsITApO2E9bC56YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLkthKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5SY3x8KHRoaXMuUmM9e30pO3RoaXMuUmNbZl18fCh0aGlzLlJjW2ZdPTApO3RoaXMuUmNbZl0rKzsxMDx0aGlzLlJjW2ZdfHwoZj0KbC5GZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC56YShmLCEwKSxmPWwuemEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5LYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGZbMF0/ZlswXToiIikrKGZbMV0/ZlsxXToiIiksITApfS5iaW5kKHRoaXMpKSl9fSwKUmU6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuYXAoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUmUoKX0uYmluZCh0aGlzKSw1MDApfSxCZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMubmIoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LEVlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxuYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLnFkKGEpOiIifSxxZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkVlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0samc6ZnVuY3Rpb24oYSxiLGQsZil7ZD0hMTtpZihiLk1lKGEpfHx0aGlzLmhzKGEpfHwwPD0KYS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LmpmJiZ3aW5kb3cuc2FuZGJveC5qZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LmpmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLkZnKGEpKXJldHVybiB0aGlzLkZnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7ZCYmKGMuaG9tYWRfaW50cm9zcGVjdD0iaWZyYW1lIik7CmMuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGEsYi5KYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi50ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy56bihlLGEpO3JldHVybiBlfSxhYjpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godWMpe2ModWMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXttLnphKGEsZSk7ZT1tLnphKGEsZSk7ZS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uS2EoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFiKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0seGQ6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LENzOmZ1bmN0aW9uKGEsYixkKXt0aGlzLnhkKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLlBjKWZvcih2YXIgYyBpbiB0aGlzLlBjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuUGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnpiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LHNoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuYWIoYSxmLkphLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5DcyhmLnRkKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxFdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QYz1hfSxkeDpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuYWIoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0sRG86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxiczpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH0sZmI6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0sWm86ZnVuY3Rpb24oKXt0cnl7dGhpcy54ZCgiaHR0cHM6Ly9hZHNlcnZlci5iYW5uZXJ0Z3QuY29tL2Fkc2VydmUvdjEvY2MiLCJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkRjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKSx0aGlzLnhkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsCiJnZXQiLG51bGwsZnVuY3Rpb24oYSl7YT1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTt0aGlzLkJjPXRoaXMuZmIoYS5jYyk/InBhc3MiOiJmYWlsIn0uYmluZCh0aGlzKSxudWxsLCEwKX1jYXRjaChhKXt9c2V0VGltZW91dCh0aGlzLmhpLmJpbmQodGhpcyksMTAwKX0saGk6ZnVuY3Rpb24oKXt0aGlzLkRjJiZ0aGlzLkRjLmxlbmd0aCYmdGhpcy5CYyYmdGhpcy5CYy5sZW5ndGg/KCJwYXNzIj09PXRoaXMuQmMmJiJmYWlsIj09PXRoaXMuRGMmJih0aGlzLnRyYWNrKCJzdGF0c19oZF9mZmNvb2tpZSIsIiIsITApLHRoaXMuQ2c9ITAsdGhpcy55ZSYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApKSwiZmFpbCI9PT10aGlzLkJjJiYiZmFpbCI9PT10aGlzLkRjJiYodGhpcy50cmFjaygic3RhdHNfaGRfY3Jvc3Njb29raWUiLCIiLCEwKSx0aGlzLnllJiZ0aGlzLnRyYWNrKCJzdGF0c19oZF9jcm9zc2Nvb2tpZWVtcHR5IiwiIiwhMCkpLHRoaXMuRGc9ITApOgpzZXRUaW1lb3V0KHRoaXMuaGkuYmluZCh0aGlzKSwxMDApfSxrcTpmdW5jdGlvbigpe3RoaXMuRGc/dGhpcy5DZyYmdGhpcy50cmFjaygic3RhdHNfaGRfZmZjb29raWVlbXB0eSIsIiIsITApOnRoaXMueWU9ITB9fX0pKGMpO3ZhciBRPWMuamt8fFE7bmV3IFE7dmFyIGU9bmV3IFE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy5kYXRhPWF8fHt9fWMuaWs9YjtiLlRhPWZ1bmN0aW9uKGEsYil7dmFyIGQ9e30sZjtmb3IoZiBpbiBiKWRbZl09YltmXTtmb3IoZiBpbiBhKWRbZl09YVtmXTtyZXR1cm4gZH07Yi5FdD17Y29kZToiMTAwMCIsdHlwZToicGVuYWx0eSIsbWVzc2FnZToiIixuYW1lOiJwZW5hbHR5In07Yi5Rcz17Y29kZToiMTAwMSIsdHlwZToibWVkaWFlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5Hdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLmxxPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLAptZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlN3PXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuZGc9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2IuV2Y9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZEZpcnN0UXVhcnRpbGUifTtiLmFnPXtjb2RlOiIxMDA3Iix0eXBlOiJhZE1pZFBvaW50IixtZXNzYWdlOiIiLG5hbWU6ImFkTWlkUG9pbnQifTtiLmVnPXtjb2RlOiIxMDA4Iix0eXBlOiJhZFRoaXJkUXVhcnRpbGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaGlyZFF1YXJ0aWxlIn07Yi5ybj17Y29kZToiMTAwOSIsdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5aZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTsKYi5kdz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuUHM9e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IubXE9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkp3PXtjb2RlOiIxMDE0Iix0eXBlOiJ3cmFwcGVyTGltaXRSZWFjaGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLnJnPXtjb2RlOiIxMDE1Iix0eXBlOiJjbGlja3Rocm91Z2giLG1lc3NhZ2U6IiIsbmFtZToiYWRDbGljayJ9O2IucXA9e2NvZGU6IjEwMTYiLHR5cGU6ImNvbnRpbnVlQ29udGVudCIsbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmdkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9OwpiLmZkPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07Yi5jZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2IudG49e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsbWVzc2FnZToiIixuYW1lOiJhZFJlcXVlc3QifTtiLldjPXtjb2RlOiIxMDIxIix0eXBlOiJhZFBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiYWRQbGF5In07Yi5mZT17Y29kZToiMTAyMiIsdHlwZToiYWRQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJhZFBhdXNlIn07Yi5oZT17Y29kZToiMTAyMyIsdHlwZToiYWRUaW1lIixtZXNzYWdlOiIiLG5hbWU6ImFkVGltZSJ9O2Iuc249e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLnNpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9OwpiLlNzPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2IueWQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2IuQWY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTtiLnNnPXtjb2RlOiIxMDI5Iix0eXBlOiJjb250ZW50UGxheWVyTXV0ZWQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllck11dGVkIn07Yi5Gdz17Y29kZToiMTAzMCIsdHlwZToidnBhaWRlcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi4kdj17Y29kZToiMTAzMSIsdHlwZToidmFzdGR1bW15YWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuYXc9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLlp2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsCm1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTtiLlJzPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTtiLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTt2YXIgaz1jLmlrfHxrO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk5rPXRoaXMuYVs1XTt0aGlzLkNtPXRoaXMuYVs1XTt0aGlzLnRsPXRoaXMuYVsxXTt0aGlzLnRtPXRoaXMuYVs0XTt0aGlzLkt1PXRoaXMuYVszXTt0aGlzLlNrPXRoaXMuYVsxMF07dGhpcy5xbj10aGlzLmFbOV07dGhpcy5zdD10aGlzLmFbN107dGhpcy5McT10aGlzLmFbNV07dGhpcy5Zdj10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs0XX1jLlRpPWI7Yi5wcm90b3R5cGU9CntNazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTms6dGhpcy5CbShhKX0sQm06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNtOnRoaXMuc2woYSl9LHNsOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50bDp0aGlzLnNtKGEpfSxzbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudG06dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkt1OnRoaXMuUmsoYSl9LFJrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Tazp0aGlzLnBuKGEpfSxwbjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucW46dGhpcy5ydChhKX0scnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnN0OnRoaXMuS3EoYSl9LEtxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5McTp0aGlzLlh2KGEpfSxYdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuWXY6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpOwp2YXIgamE9Yy5UaXx8amEsdmM9bmV3IGphKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dmMuTWsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5raz1iO2IucHJvdG90eXBlPXtGZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0sa2E6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fAoieCIpfSxYcTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxvZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMub2QoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5vZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGphOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPQp0aGlzLkZlKHRoaXMua2EoKSsiIiksYT0oYSsiIit0aGlzLnJldmVyc2UoYSsiIikpLm1hdGNoKC8uezEsMn0vZyksYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5vZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0sWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYSgpKyIyIn0saGg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5GZSh0aGlzLlhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMub2QoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMua2t8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW49dGhpcy5hWzddO3RoaXMuY3Q9dGhpcy5hWzNdO3RoaXMuZnE9dGhpcy5hWzEwXTt0aGlzLnp2PQp0aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs0XX1jLlRtPWI7Yi5wcm90b3R5cGU9e0xuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Nbjp0aGlzLmJ0KGEpfSxidDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuY3Q6dGhpcy5lcShhKX0sZXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmZxOnRoaXMueXYoYSl9LHl2OmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy56djp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmo6YX19fSkoYyk7dmFyIGthPWMuVG18fGthLHdjPW5ldyBrYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPXdjLkxuKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9dmFyIGE9L3h5ei8udGVzdChmdW5jdGlvbigpe3h5en0pPy9cYl9zdXBlclxiLzovLiovO2IuZXh0ZW5kPWZ1bmN0aW9uKGgpe3ZhciBkPQp0aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBoW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYS50ZXN0KGhbY10pP2Z1bmN0aW9uKGEsYil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5vO3RoaXMubz1kW2FdO3ZhciBmPWIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMubz1oO3JldHVybiBmfX0oYyxoW2NdKTpoW2NdO2g9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmw/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpP2YubDpmdW5jdGlvbigpe2QubC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9OmZ1bmN0aW9uKCl7fTtoLnByb3RvdHlwZT1mO2YuY29uc3RydWN0b3I9aDtoLmV4dGVuZD1iLmV4dGVuZDtyZXR1cm4gaH07Yy52aj1ifSkoYyk7dmFyIEw9Yy52anx8TDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMudXA9dGhpcy5hWzVdO3RoaXMubHA9dGhpcy5hWzVdO3RoaXMuQmo9dGhpcy5hWzVdO3RoaXMuQ3I9dGhpcy5hWzJdO3RoaXMucnM9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbOV19Yy5xbz1iO2IucHJvdG90eXBlPXt0cDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudXA6dGhpcy5rcChhKX0sa3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmxwOnRoaXMuQWooYSl9LEFqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQmo6dGhpcy5CcihhKX0sQnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkNyOnRoaXMucXMoYSl9LHFzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5yczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGxhPWMucW98fGxhLHhjPW5ldyBsYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOwp3aW5kb3cuRD14Yy50cCg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk1sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuTWE9e307dGhpcy5JPW51bGw7dGhpcy5NYz0xMDA7dGhpcy5KYj0wO3RoaXMuV2E9MTUwO3RoaXMuTWI9MDt0aGlzLnh1KGIpfSxmOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5KYjw9dGhpcy5XYT8odGhpcy5KYisrLHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpOjA+dGhpcy5XYSYmKHRoaXMuTWI9d2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5NYykpfSxtdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpiPnRoaXMuV2E/ITA6ITF9LGhmOmZ1bmN0aW9uKCl7dGhpcy5KYj0wfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0seHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sUjpmdW5jdGlvbihiKXtlLnRyYWNrKCJzdGF0c19wbGF5ZXIiLApiLlAoKSwhMCk7dGhpcy5NYVtiLmthKCldPWI7TSYmTS5waCYmTS5hdihiKX0sUng6ZnVuY3Rpb24oKXtyZXR1cm4gZS5EZSh0aGlzLk1hKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5NYSlpZihhPT10aGlzLk1hW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLk1hW2Iua2EoKV0/ITA6ITF9LGNzOmZ1bmN0aW9uKGIpe2I9Yi5JYSgpO2Zvcih2YXIgYSBpbiB0aGlzLk1hKWlmKGIuaWQ9PXRoaXMuTWFbYV0uSWEoKS5pZClyZXR1cm4hMDtyZXR1cm4hMX0saXk6ZnVuY3Rpb24oYil7dGhpcy5NYVtiLmlkXT1udWxsfX0pfSkoYyk7dmFyIHA9Yy5NbHx8cDsoZnVuY3Rpb24oYyl7Yy5PbD1MLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLnZpZGVvVGFnPXRoaXMuY29udGFpbmVyPXRoaXMuaWQ9bnVsbDt0aGlzLk1jPTEwO3RoaXMuSmI9MDt0aGlzLldhPTUwO3RoaXMuVz1udWxsO3RoaXMubWE9ITE7dGhpcy5wbGF5ZXI9Yjt0aGlzLkRiPQoiIjt0aGlzLnhnPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuSWEoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTmE6ZnVuY3Rpb24oKXt9LEh1OmZ1bmN0aW9uKGIpe3RoaXMuVz1ifSxTeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLld9LEF1OmZ1bmN0aW9uKGIpe3RoaXMuVWU9Yn0sUXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VZX0sVGU6ZnVuY3Rpb24oKXt9LFQ6ZnVuY3Rpb24oKXt0aGlzLkpiPD10aGlzLldhJiYodGhpcy5KYisrLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLHRoaXMuTWMpKX0saXNGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dHJ5e2lmKGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKWRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKClbImNhdGNoIl0oZnVuY3Rpb24oKXt9KTsKZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTtlbHNlIHJldHVybiExfWNhdGNoKGIpe319LE5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSWEoKX0scGF1c2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wbGF5KCl9LGthOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9LEhkOmZ1bmN0aW9uKGIpe3RoaXMuaWQ9Yn0sbHk6ZnVuY3Rpb24oKXt9LFo6ZnVuY3Rpb24oYil7aWYoIWIpcmV0dXJuITE7dGhpcy52aWRlb1RhZz1iO3RoaXMubnIoKXx8dGhpcy52bigpO3RoaXMuSGQodGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIikpfSwKVHg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sdm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sbnI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9Yn0sSWE6ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuY29udGFpbmVyP3RoaXMuY29udGFpbmVyKCk6dGhpcy5jb250YWluZXJ9LGdldFJhd1BsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sSmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5jdXJyZW50VGltZT9iLmN1cnJlbnRUaW1lOjB9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZzsKcmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxMYTpmdW5jdGlvbigpe3JldHVybiExfSxheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYiYmYi5tdXRlZD9iLm11dGVkOiExfSxPZTpmdW5jdGlvbigpe3JldHVybiExfSxSaDpmdW5jdGlvbihiKXt0aGlzLkRiPWJ9LFB4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRGJ9LE1oOmZ1bmN0aW9uKCl7dGhpcy5EYj1udWxsfSxWeDpmdW5jdGlvbigpe3ZhciBiPSExO3RoaXMuRGImJihiPSEwKTtyZXR1cm4gYn0sZnk6ZnVuY3Rpb24oKXt0aGlzLnhnfHwodGhpcy54Zz0hMCl9LEFlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LE14OmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnZpZGVvVGFnO2EmJmEuZ2V0QXR0cmlidXRlKCJpZCIpJiYKKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5PbHx8dDsoZnVuY3Rpb24oYyl7Yy5CaT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLlNmPSIxIjt0aGlzLlRmPSIyIjt0aGlzLmhuPSIzIjt0aGlzLlRjPTA7dGhpcy52aD0zMDt0aGlzLlJiPVtdO3RoaXMuaWI9W107dGhpcy5wYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5mZz10aGlzLm5pPSExO3RoaXMuc3RhdHVzPXRoaXMuVGM7dGhpcy5pZD1lLmFhKDEwKTt0aGlzLm5mKGIpO3RoaXMueXUoYSl9LGY6ZnVuY3Rpb24oKXt9LHBhOmZ1bmN0aW9uKCl7dGhpcy5uaXx8KHRoaXMubmk9ITAsZS5SZSgpKX0sWWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLlAoKTtSJiZSLmFjJiYhbWEmJihtYT0hMCxlLnRyYWNrKCJwb3NzaWJsZURvdWJsZUFkIiwKIjEwNF8iK2IpKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuamEoKV18fCh3aW5kb3dbYS5qYSgpXT17fSk7d2luZG93W2EuamEoKV1bYi5rYSgpXXx8KHdpbmRvd1thLmphKCldW2Iua2EoKV09e30sd2luZG93W2EuamEoKV1bYi5rYSgpXS5pbml0aWF0b3I9ZS5ZYigpKTt3aW5kb3dbYS5qYSgpXVtiLmthKCldW2UuWWIoKV0/d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldKys6d2luZG93W2EuamEoKV1bYi5rYSgpXVtlLlliKCldPTF9LCRyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxhPSEwLGg9bmV3IEo7d2luZG93W2guamEoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0mJndpbmRvd1toLmphKCldW2Iua2EoKV0uaW5pdGlhdG9yIT1lLlliKCkmJih0aGlzLm9mKCksYT0hMSk7cmV0dXJuIGF9LEc6ZnVuY3Rpb24oYixhKXt2YXIgaD0hMDtiJiYoaD0hMSk7aWYoIXRoaXMud2EoKSl7dGhpcy5XcigpOwppZighdGhpcy4kcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5vZigpO3JldHVybn10aGlzLm9mKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5maSgpO3RoaXMuZmc9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sczpmdW5jdGlvbihiLGEpe3RoaXMud2EoKXx8KHRoaXMuUmIucHVzaChiKSx0aGlzLmliLnB1c2goe3JlYXNvbjpiLGRldGFpbDphfSkpfSxmaTpmdW5jdGlvbigpe3ZhciBiPSJ1bmtub3duIixhPVtdO3RoaXMuUmImJjA8dGhpcy5SYi5sZW5ndGgmJih0aGlzLlJiPWUudW5pcXVlKHRoaXMuUmIpLGUudHJhY2soImFjdGl2YXRlZEJ5Iix0aGlzLlJiLmpvaW4oIiwiKSkpO2lmKHRoaXMuaWIpe2Zvcih2YXIgaD0wO2g8dGhpcy5pYi5sZW5ndGg7aCsrKXRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPT10aGlzLnBjW2JdJiZhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLHRoaXMucGNbdGhpcy5pYltoXS5yZWFzb25dPAp0aGlzLnBjW2JdJiYoYT1bXSxhLnB1c2godGhpcy5pYltoXS5kZXRhaWwpLGI9dGhpcy5pYltoXS5yZWFzb24pO3RoaXMucGNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITAsYSl9fSxVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZnfSx2OmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5TZn0sb2Y6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRmfSxGdTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuaG59LG5hOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5UY30sWWY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuU2Z9LEN4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLlRmfSx3YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cyE9dGhpcy5UY30sbmY6ZnVuY3Rpb24oYil7dGhpcy5wbGF5ZXI9CmJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0seXU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LFZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sRnM6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLkJpfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJxPXRoaXMuYVs0XTt0aGlzLmpsPXRoaXMuYVs5XTt0aGlzLlhuPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzFdfWMubG89YjtiLnByb3RvdHlwZT17cXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnJxOnRoaXMuaWwoYSl9LGlsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qbDp0aGlzLlduKGEpfSxXbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYT1jLmxvfHxuYSx5Yz0KbmV3IG5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9eWMucXEoNCk7KGZ1bmN0aW9uKGMpe2MuUWo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTt2YXIgb2E9Yy5Ranx8Cm9hOyhmdW5jdGlvbihjKXtjLlJqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9Yi5EeDthP2Eub2E/YS5vYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt2YXIgYj0hMSxmPSIiO2EuZ2V0RXJyb3ImJihiPWEuZ2V0RXJyb3IoKSk7Ynx8YS5kZXRhaWwuZ2V0RXJyb3ImJihiPWEuZGV0YWlsLmdldEVycm9yKCkpO2IuZ2V0RXJyb3JDb2RlJiYoZis9Yi5nZXRFcnJvckNvZGUoKSk7Yi5nZXRNZXNzYWdlJiYoZis9Yi5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIiksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmIuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5zKCJmcmFtZXdvcmsiKSx0aGlzLm0oKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBwYT1jLlJqfHxwYTsoZnVuY3Rpb24oYyl7Yy5Taj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYj1uZXcgb2Eod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBwYShiLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgcWE9Yy5Tanx8cWE7KG5ldyBxYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5haj10aGlzLmFbNF07dGhpcy5Sbj10aGlzLmFbN107dGhpcy5qPXRoaXMuYVszXX1jLkRyPWI7Yi5wcm90b3R5cGU9eyRpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hajp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuUm46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLkRyfHxyYSx6Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD16Yy4kaSg0KTsoZnVuY3Rpb24oYyl7Yy5Faz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLmJjPSExO3RoaXMuRWcoKTsKdGhpcy5HZygpO3RoaXMucHA9ITF9LEVnOmZ1bmN0aW9uKCl7dGhpcy5iYz0hMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7Ynx8KHRoaXMuYmM9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sR2c6ZnVuY3Rpb24oKXtpZighdGhpcy5iYyl7dmFyIGI9dGhpcy5JYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuYmM9ITApO3RoaXMuWihhKX19LE5hOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pOwplbHNlIGlmKGIuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sVGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5KZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuSmQoYSl9LmJpbmQodGhpcykpfSwKSmQ6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5wbGF5ZXI7YS5nZXRQb3NpdGlvbigpO2EuZ2V0UG9zaXRpb24oKTthLmdldER1cmF0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLlVlJiYoMCx0aGlzLlVlKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09CnRoaXMucGF1c2UoKT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJKV1BsYXllciJ9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7Yi5nZXRGdWxsc2NyZWVuJiZiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LEFlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5Fa3x8c2E7KGZ1bmN0aW9uKGMpe2MuRGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30sbmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuVWM9ITE7dGhpcy5nZT0xO3RoaXMuVmM9W107dGhpcy54Yj0KITF9LGY6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz10aGlzLlVjPSExO3RoaXMuZ2U9MTt0aGlzLlZjPVtdO3RoaXMueGI9ITE7dGhpcy5nZXRQbGF5ZXIoKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuZ2U9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnhiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy54Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYKKHRoaXMueGI9ITApKSksYS5hZHZlcnRpc2luZy50YWcmJih0aGlzLnhiPSEwKSk6dGhpcy52KCJubyBhZHZlcnRpc2luZyBjb25maWd1cmVkIGZvciBwbGF5ZXIiKSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRDb21wbGV0ZSYmYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZENvbXBsZXRlIik7dGhpcy5VYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpfSk7CmIuX2V2ZW50cyYmYi5fZXZlbnRzLmFkTWV0YSYmYi5fZXZlbnRzLmFkTWV0YS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLnYoImFkTWV0YSIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudigiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy52KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pOwpiLl9ldmVudHMmJmIuX2V2ZW50cy50aW1lJiZiLl9ldmVudHMudGltZS5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5pc1BsYXlpbmc9ITA7YS5kdXJhdGlvbj50aGlzLnZoJiYhdGhpcy53YSgpJiYodGhpcy54Yj8odGhpcy5zKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnMoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMud2EoKSYmKHRoaXMubmEoKSx0aGlzLmdldFBsYXllcigpLnBwPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5EYjthJiYoYS5CZCgpLGEudWUoKSl9fS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZENvbXBsZXRlKWIub25BZENvbXBsZXRlKGZ1bmN0aW9uKCl7dGhpcy52KCJvbkFkQ29tcGxldGUiKTt0aGlzLlVjPSEwfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRJbXByZXNzaW9uKWIub25BZEltcHJlc3Npb24oZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRJbXByZXNzaW9uIik7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLnYoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudigib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy52aCYmIXRoaXMud2EoKSYmKHRoaXMueGI/KHRoaXMucygiY29udGVudHBsYXlOb0FkcyIsCiIiKSx0aGlzLm0oKSk6KHRoaXMucygiY29udGVudHBsYXlUaW1lIiwxRTMqTWF0aC5yb3VuZChhLmR1cmF0aW9uLzFFMykpLHRoaXMubSghMCkpKX0uYmluZCh0aGlzKSl9LG9uQWRFcnJvcjpmdW5jdGlvbihiKXt2YXIgYT1iLnRhZzstMT09dGhpcy5WYy5pbmRleE9mKGEpJiZ0aGlzLlZjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudigpLHRoaXMucGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLnYoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy52KCJlbXB0eSIpOih0aGlzLnMoImFkZXJyb3IiLGIuY29kZSksdGhpcy5WYy5sZW5ndGg+PXRoaXMuZ2UmJnRoaXMubSgpKX0sRnM6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/CnRoaXMueGU/dGhpcy54ZSsrOnRoaXMueGU9MTp0aGlzLndlP3RoaXMud2UrKzp0aGlzLndlPTE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKTtlLldoKGEudmlkZW9UYWcpP2EuYmM/dGhpcy52KCJwbGF5ZXIgaXMgaW52YWxkIik6dGhpcy5VY3x8dGhpcy5pc1BsYXlpbmc/KHRoaXMud2U+dGhpcy54ZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLkVnKCksYS5HZygpLGEuYmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5Ea3x8dGE7KGZ1bmN0aW9uKGMpe2MuRms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5TcSgpfHwhYi5hdXRob3JpdHl8fAohYi5hdXRob3JpdHl8fCJ3d3cuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicXMyLnByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcm9kLnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9CjA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBzYSh3aW5kb3cuandwbGF5ZXIoYlthXSkpO3RoaXMuTihoKXx8dGhpcy5jcyhoKXx8KHRoaXMuUihoKSxoPW5ldyB0YShoLHRoaXMuSSksaC5NKCksaC5mKCkpfX10aGlzLlQoKX19LE94OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LFNxOmZ1bmN0aW9uKCl7dmFyIGI9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5Ga3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZrPXRoaXMuYVs0XTt0aGlzLnNqPXRoaXMuYVs1XTt0aGlzLkFtPXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzhdfWMudnE9YjtiLnByb3RvdHlwZT17dWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZrOgp0aGlzLnJqKGEpfSxyajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuc2o6dGhpcy56bShhKX0sem06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkFtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIHdhPWMudnF8fHdhLEFjPW5ldyB3YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUFjLnVrKDQpOyhmdW5jdGlvbihjKXtjLkZtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLlYoYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuWihiKToKdGhpcy5jYSgpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LE5hOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuY3VycmVudFRpbWUoKSxiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLlcmJnRoaXMuVygpfSxKZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChoKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT8KYi5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sTGE6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2goaCl7YT0hMX1hJiZiLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLmN1cnJlbnRUaW1lKXJldHVybiBiLmN1cnJlbnRUaW1lKCl9fSl9KShjKTt2YXIgeGE9Yy5GbXx8eGE7KGZ1bmN0aW9uKGMpe2MuRW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMuUz0KdGhpcy5TfHwhMTt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE9dGhpcy5JYz10aGlzLkFhPXRoaXMuWmM9ITE7dGhpcy5JaD1lLkliKDEwKTt0aGlzLm1pPSEwO3RoaXMudmM9dGhpcy5laD0hMTt0aGlzLk9zKGIuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy55aCgpLHRoaXMuV28oKSx0aGlzLnNiKCkpfSxPczpmdW5jdGlvbihiKXtyZXR1cm4gZS50YSgidC1vbmxpbmUuZGUiKT8hMT09PWIub3B0aW9uc18uYWRQcmVyb2xsOiExfSxneTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Y29uc29sZS5pbmZvKHRoaXMuZ2V0UGxheWVyKCkua2EoKSwiOyIsIndpbmRvdy5pbWE6IiwiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGIuWCwiOyIsdHlwZW9mIGIuWCwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYi5YP2IuWC5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGIuWD90eXBlb2YgYi5YLnN0YXRlOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hOiIsIjsiLGIuaW1hLCI7Iix0eXBlb2YgYi5pbWEsIjsiLCJwbGF5ZXIuaW1hMzoiLCI7IixiLkosIjsiLHR5cGVvZiBiLkosIjsiLCJwbGF5ZXIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkZEV2ZW50TGlzdGVuZXI6IiwiOyIsYi5KP2IuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYWRkRXZlbnRMaXN0ZW5lcjoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuR2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IiwKYi5KP2IuSi5HYToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLkdhOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuaW1hJiZiLmltYS5HYT9iLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWEmJmIuaW1hLkdhP3R5cGVvZiBiLmltYS5HYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmdldEFkc01hbmFnZXIoKToiLCI7IixiLkomJmIuSi5HYT9iLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLGIuSiYmYi5KLkdhP3R5cGVvZiBiLkouR2EoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuY2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixiLko/Yi5KLmNlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouY2U6InVuZGVmaW5lZFgiLCI7IiwKInBsYXllci5pbWEuX2Fkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuZWU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc01hbmFnZXI6IiwiOyIsYi5KP2IuSi5lZToidW5kZWZpbmVkWCIsIjsiLGIuSj90eXBlb2YgYi5KLmVlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuYWRzTG9hZGVyOiIsIjsiLGIuaW1hP2IuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm9hOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc0xvYWRlcjoiLCI7IixiLko/Yi5KLm9hOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkoub2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLm1lOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwKIjsiLGIuSj9iLkoubWU6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5tZToidW5kZWZpbmVkWCIsIjsiLCJET05FIix0aGlzLkloKX0sQWI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2IuaW1hMyYmKHRoaXMuaW1hPWIuaW1hMyk7aWYoYi5pbWEpe3RoaXMuaW1hPWIuaW1hO3RyeXsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pbWEmJnRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfJiYxPT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKS5hY3RpdmVQbHVnaW5zXy5pbWEmJih0aGlzLmltYT10aGlzLmltYSgpLHRoaXMuaW1hLmNvbnRyb2xsZXImJih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYSl7fX1yZXR1cm4gdGhpcy5pbWF9LFhiOmZ1bmN0aW9uKCl7aWYoIXRoaXMub2Epe3ZhciBiPXRoaXMuQWIoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm9hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJgoodGhpcy5vYT1iLl9hZHNMb2FkZXIpLGIuZ2V0QWRzTG9hZGVyJiYodGhpcy5vYT1iLmdldEFkc0xvYWRlciksYi5jb250cm9sbGVyJiZiLmNvbnRyb2xsZXIuc2RrSW1wbCYmYi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyJiYodGhpcy5vYT1iLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXIpKX1yZXR1cm4gdGhpcy5vYX0sUmc6ZnVuY3Rpb24oKXtpZighdGhpcy5JYyl7dmFyIGI9dGhpcy5BYigpO2ImJihiLmFkc01hbmFnZXImJih0aGlzLkljPWIuYWRzTWFuYWdlciksYi5nZXRBZHNNYW5hZ2VyJiYodGhpcy5JYz1iLmdldEFkc01hbmFnZXIoKSkpfXJldHVybiB0aGlzLkljfSxhczpmdW5jdGlvbigpe2lmKCF0aGlzLmRoKXt2YXIgYj10aGlzLkFiKCksYT10aGlzLlpyKCk7d2luZG93LmltYSYmYiYmKGIuX2Fkc0xvYWRlcnx8Yi5hZHNMb2FkZXJ8fGEpJiYodGhpcy5kaD0hMCl9cmV0dXJuIHRoaXMuZGh9LFpyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKIXRoaXMuWmMmJmIuYWRzJiYoYi5hZHMuc3RhdGV8fGIuYWRzLl9zdGF0ZSkmJih0aGlzLlpjPSEwKTtyZXR1cm4gdGhpcy5aY30sc2I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLlhiKCk7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGg9ImFkc01hbmFnZXJMb2FkZWQiLGQ9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50JiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGg9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpOwp3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihkPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe3RoaXMuZXUoKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLHRoaXMuUyk7dGhpcy5mYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksCjIwKX0sZXU6ZnVuY3Rpb24oKXt0aGlzLnZjPSEwO3ZhciBiPXRoaXMuUmcoKTtpZihifHx0aGlzLndhKCkpe3ZhciBhPSJhZEVycm9yIixoPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXZlbnQmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihoPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKGgsZnVuY3Rpb24oYSl7dGhpcy5nYShhLCEwKTt0aGlzLnMoImFkZXJyb3IiLAp0aGlzLlMpO3RoaXMuZmEoITApfS5iaW5kKHRoaXMpKTt2YXIgZD0iIjtlLlZhKCkmJihkPSJNXyIpO2IuYWRkRXZlbnRMaXN0ZW5lcigic3RhcnQiLGZ1bmN0aW9uKCl7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsic3RhcnQiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJmaXJzdHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53Yz0hMDtpZihlLnRhKCJjaGlwLmRlIikpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYS5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTsKYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsidGhpcmRxdWFydGlsZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBsZXRlIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMud2M9ITA7ZS50YSgiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy5zKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5mYSgpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwKMjApfSxOeDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7IXRoaXMudWcmJmIuYWRzJiYodGhpcy51Zz1iLmFkcyk7cmV0dXJuIHRoaXMudWd9LFdvOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZHNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHRyaWdnZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZmEoITApO3RoaXMucygidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTsKYi5vbigiaW1hMy1hZC1lcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmZhKCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpfS5iaW5kKHRoaXMpKTtiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCk7dGhpcy5ZZSgpfS5iaW5kKHRoaXMpKX0samQ6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0cnl7aWYoaG9tYWRVdGlscyYmaG9tYWRVdGlscy5ZKWhvbWFkVXRpbHMuVWEmJihiPSEwKTtlbHNle3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59fWNhdGNoKGEpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5qZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YiYmKChiPXRoaXMuUmcoKSkmJmIuZGVzdHJveT9iLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSw1MCkpfSx5aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7CmlmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuYXMoKSl7dmFyIGE9dGhpcy5BYigpLGg9dGhpcy5YYigpO2EmJmgmJih0aGlzLkFiKCksdGhpcy5YYigpLHRoaXMudmN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52Yz90aGlzLnYoKToodGhpcy5mYSghMCksdGhpcy5zKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpO3RoaXMuQWIoKX1lbHNlIHRoaXMuZWg/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLkFiKCksYj10aGlzLlhiKCk7YSYmIWI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5mYSgpKToodGhpcy5mYSghMCksdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMuZWg9ITA7Yi5pc1BsYXlpbmcoKSYmMTA8Yi5jdXJyZW50VGltZSgpfHx0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55aCgpfS5iaW5kKHRoaXMpLAo1MCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgaD0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJgoiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LFhvOmZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWM9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuYWRzKXtpZih0aGlzLkFjIT1iLmFkcy5zdGF0ZSYmKHRoaXMuQWM9Yi5hZHMuc3RhdGUpLCJhZC1wbGF5YmFjayI9PXRoaXMuQWMpe3RoaXMudigiYWQtcGxheWJhY2siKTtyZXR1cm59fWVsc2UgdGhpcy5BYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWG8oKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbikuaW5kZXhPZigic3Rlcm4uZGUiKSYmMTAwOT09dGhpcy5TPyh0aGlzLmVhPSEwLHRoaXMubSghMCkpOih0aGlzLmVhPQohMCx0aGlzLnYoImVtcHR5IHZhc3QiKSl9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLndhKCl8fChifHwodGhpcy5taT0hMSksdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLkcodGhpcy5taSxmdW5jdGlvbigpe3RoaXMuamQoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpKX0sZnA6ZnVuY3Rpb24oKXt0aGlzLld4fHwoMTA8dGhpcy5zdz8odGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhYXphIiksd2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLnN3KyssdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS52cEV2ZW50P3RoaXMubHUoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZnAoKX0uYmluZCh0aGlzKSwKNTApKSl9LGx1OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLnR3KXt0aGlzLnR3PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZXJyb3IiK2EsZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZmEuYmluZCh0aGlzKSw1MDApfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkLWVuZGVkIisKYSxmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzbG90LWNvbXBsZXRlIithLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtcmVhZHkiK2EsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9fX0pfSkoYyk7dmFyIHlhPWMuRW18fHlhOyhmdW5jdGlvbihjKXtjLkdtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKCF3aW5kb3cuZGVtb1BsYXllcil7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlmcmFtZSIpLGE7YT10aGlzLlhoKHdpbmRvdyk7Zm9yKHZhciBoPTA7aDxiLmxlbmd0aDtoKyspdHJ5e2E9YXx8dGhpcy5YaChiW2hdKX1jYXRjaChkKXt9dGhpcy5UKCl9fSxYaDpmdW5jdGlvbihiKXt2YXIgYT1bXTtiLnZpZGVvanMmJmIudmlkZW9qcy5nZXRQbGF5ZXJzPwphPWIudmlkZW9qcy5nZXRQbGF5ZXJzKCk6Yi52aWRlb2pzJiZiLnZpZGVvanMucGxheWVycyYmKGE9Yi52aWRlb2pzLnBsYXllcnMpO2lmKDA8ZS5EZShhKSl7Yj1hO2Zvcih2YXIgaCBpbiBiKWIuaGFzT3duUHJvcGVydHkoaCkmJihhPW5ldyB4YShiW2hdKSxhLm1hfHx0aGlzLk4oYSl8fCExPT09YS5nZXRSYXdQbGF5ZXIoKS5pc1JlYWR5X3x8KHRoaXMuUihhKSwobmV3IHlhKGEsdGhpcy5JKSkuZigpKSk7cmV0dXJuITB9cmV0dXJuITF9LFQ6ZnVuY3Rpb24oKXt0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLHRoaXMuTWMpfX0pfSkoYyk7dmFyIHphPWMuR218fHphLEFhPW5ldyB6YShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy52dD10aGlzLmFbMTBdO3RoaXMuTGs9dGhpcy5hWzldO3RoaXMuJHA9dGhpcy5hWzldO3RoaXMuY3g9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzJdfWMubm49YjtiLnByb3RvdHlwZT17dXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnZ0OnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mazp0aGlzLlpwKGEpfSxacDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuJHA6dGhpcy5ieChhKX0sYng6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmN4OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmo6YX19fSkoYyk7dmFyIEJhPWMubm58fEJhLEJjPW5ldyBCYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUJjLnV0KDQpOyhmdW5jdGlvbihjKXtjLkJsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuJGU9MDt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5wbGF5ZXJDb250YWluZXI7CmlmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5jYSgpO3JldHVybn10aGlzLlYoYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtiP3RoaXMuWihiKTp0aGlzLmNhKCl9LEl0OmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuRGIsaD10aGlzLmthKCksZD0iIjtiLm1lbW8mJihkPWIubWVtby52aWRlb2lkKTtkJiZhJiZhLmFjJiYoMDw9aC5pbmRleE9mKGQpfHxhLkJkKCkpfSxwYXVzZTpmdW5jdGlvbihiKXtifHwodGhpcy4kZT0wKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLGIucGxheWVySW5zdGFuY2UucGF1c2UoKSk6CndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxMYTpmdW5jdGlvbigpe3RoaXMuJGUrKztpZigxMDx0aGlzLiRlKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7cmV0dXJuITB9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGxheT8od2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wbGF5KCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjayYmKHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLHdpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrKCkpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpyZXR1cm4hMT09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09Yi5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6Yi5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lKXJldHVybiBiLnBsYXllckluc3RhbmNlLmN1cnJlbnRUaW1lO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSlyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuZHVyYXRpb24pcmV0dXJuIGIucGxheWVySW5zdGFuY2UuZHVyYXRpb247aWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbigpfSwKUDpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sTmE6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJnRoaXMuVyYmdGhpcy5XKCl9fSl9KShjKTt2YXIgQ2E9Yy5CbHx8Q2E7KGZ1bmN0aW9uKGMpe2MuQWw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpJiZ0aGlzLkViKyssMTU8dGhpcy5FYil0aGlzLnMoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5tKCEwKTtlbHNle3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHZlcnRpc2luZylpZihiPWIuYWR2ZXJ0aXNpbmcuYWRzTG9hZGVyKXt0aGlzLnplPQohMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5lYXx8KHRoaXMucygiYWRlcnJvciIsdGhpcy5TKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkFhKCl9LmJpbmQodGhpcyksMTApfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBoPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8CjQwMz09YSloPSEwO2h8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoaD0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGh9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgaD1iLmdldEVycm9yKCk7aWYoaC5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBoLmdldEVycm9yQ29kZSYmYShoLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSwKdGhpcykpe3RoaXMuQ2EoKTticmVha319LGY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuQWEoKTt2YXIgYT13aW5kb3cub3ZWaWRlbzthfHwoYT13aW5kb3cub3YudmlkZW8uUGxheWVyKTthJiZhLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLnNxPyhhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpKSxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsdGhpcy5TKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksdGhpcy5zcT0hMCxhLnJlZ2lzdGVyRXZlbnQoYS5PTl9QTEFZRVJfU1RPUFBFRCwKZnVuY3Rpb24oYSl7Yi5JdChhKX0uYmluZCh0aGlzKSkpOmIuaXNQbGF5aW5nKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt0aGlzLkcoYil9fSl9KShjKTt2YXIgRGE9Yy5BbHx8RGE7KGZ1bmN0aW9uKGMpe2MuQ2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5XYT0xNTAwO3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGI9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmCndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgmJihiPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBoPW5ldyBDYShiW2FdKTtoLm1hfHx0aGlzLk4oaCl8fCh0aGlzLlIoaCksKG5ldyBEYShoLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRWE9Yy5DbHx8RWEsRmE9bmV3IEVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmFvPXRoaXMuYVsxMF07dGhpcy5obT10aGlzLmFbM107dGhpcy5Cdj10aGlzLmFbMTBdO3RoaXMuc289dGhpcy5hWzddO3RoaXMuQ2s9dGhpcy5hWzFdOwp0aGlzLmo9dGhpcy5hWzhdfWMuSXM9YjtiLnByb3RvdHlwZT17JG46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmFvOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obTp0aGlzLkF2KGEpfSxBdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuQnY6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnNvOnRoaXMuQmsoYSl9LEJrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Dazp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEdhPWMuSXN8fEdhLENjPW5ldyBHYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLiRuKDQpOyhmdW5jdGlvbihjKXtjLnlrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFJhd1BsYXllcigpLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtzd2l0Y2goYi5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmEucGFyZW50Tm9kZSYmKGE9YS5wYXJlbnROb2RlKX10aGlzLk90PWIucG9zaXRpb25pbmc7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7aC5zdHlsZS53aWR0aD1iLndpZHRoO2guc3R5bGUubWluV2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7aC5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7aC5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtoLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5PdCl7Y2FzZSAiYmVmb3JlIjphLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGgsYSk7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmEuYXBwZW5kQ2hpbGQoaCk7CmJyZWFrO2RlZmF1bHQ6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChoLGEpfXRoaXMuVihoKTt0aGlzLlooaCk7dGhpcy5tZD1ofSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMubWQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLm1kKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZXA6ZnVuY3Rpb24oKXtlLmtoKHRoaXMubWQpO2UuS2UodGhpcy5tZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVwKCl9LmJpbmQodGhpcyksNTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LE9lOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgSGE9Yy55a3x8SGE7KGZ1bmN0aW9uKGMpe2MueGs9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMucygiZXh0ZXJuYWwiKTt0aGlzLkcoITApfX0pfSkoYyk7dmFyIElhPWMueGt8fElhOyhmdW5jdGlvbihjKXtjLnprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuV2E9CjE1MDA7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYobSYmbS5pbnJlYWQpe3ZhciBiPW0uaW5yZWFkLGE9ZS5PZyhiLCJlbGVtZW50SUQiKTtpZihlLmtoKGEpJiYoYj1uZXcgSGEoYiksIXRoaXMuTihiKSkpe3RoaXMuUihiKTsobmV3IElhKGIsdGhpcy5JKSkuZigpO3JldHVybn10aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLk1iPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBKYT1jLnprfHxKYSxLYT1uZXcgSmEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWmk9dGhpcy5hWzddO3RoaXMuZm89dGhpcy5hWzhdO3RoaXMucm09dGhpcy5hWzldO3RoaXMuYnE9dGhpcy5hWzhdO3RoaXMuUHY9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbMV19Yy5Bcj0KYjtiLnByb3RvdHlwZT17WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlppOnRoaXMuZW8oYSl9LGVvOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mbzp0aGlzLnFtKGEpfSxxbTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucm06dGhpcy5hcShhKX0sYXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJxOnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qdjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuQXJ8fExhLERjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLllpKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5saz1iO2IucHJvdG90eXBlPQp7c2V0RGF0YTpmdW5jdGlvbihhKXt0aGlzLmRhdGE9YX0senU6ZnVuY3Rpb24oYSl7dGhpcy5tZXRob2Q9YX0sYXBwZW5kRGF0YTpmdW5jdGlvbihhLGIpe3RoaXMuZGF0YVthXT1ifSx3bjpmdW5jdGlvbihhKXt0cnl7dGhpcy5hcHBlbmREYXRhKCJob21hZF9tYWNyb3MiLEpTT04uc3RyaW5naWZ5KGEpKX1jYXRjaChiKXt9fX19KShjKTt2YXIgej1jLmxrfHx6OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsaCxkLGYpe3RoaXMuZ2I9YTt0aGlzLkpnPXRoaXMud2k9ITE7dGhpcy56aD1kO3RoaXMuWWg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZ2I9bmV3IHooYSkpO3ZhciBjPXRoaXMudWI9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTsKZWxzZSBpZig0PT1jLnJlYWR5U3RhdGUmJjA9PWMuc3RhdHVzJiZsJiZsLk5lKHRoaXMuZ2IudXJsKSYmbC5SZCl7dmFyIGU9bmV3IHooYS51cmwpO2UuenUoIlBPU1QiKTtlLnNldERhdGEoe2hvbWFkX3Bpbmc6InRydWUifSk7KG5ldyBiKGUsZnVuY3Rpb24oYSl7dmFyIGI9ITE7dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goaCl7Yj0hMX1iJiZiLnBpbmcmJiJwb25nIj09Yi5waW5nJiYoYj0hMCk7Ynx8bC5oYSgicmVxdWVzdF9mYWlsZWRfbm9wb25nICIpfSxmdW5jdGlvbigpe2wuaGEoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLm1rPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdiLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLkpnJiYKKGErPSImaG9tYWRfZm9sbG93X3JlZGlyZWN0cz10cnVlIik7dHJ5e3RoaXMuWWg/dGhpcy51Yi5vcGVuKHRoaXMuZ2IubWV0aG9kLHRoaXMuZ2IudXJsLCExKTp0aGlzLnViLm9wZW4odGhpcy5nYi5tZXRob2QsdGhpcy5nYi51cmwsITApLHRoaXMud2l8fCh0aGlzLnViLndpdGhDcmVkZW50aWFscz0hMCksMDxhLmxlbmd0aCYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxhWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy51Yi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy51Yi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuTmUodGhpcy5nYi51cmwpP2wuUmQ/bC5oYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5OZSh0aGlzLmdiLnVybCksdGhpcy56aCYmdGhpcy56aCgpfXJldHVybiB0aGlzLnVifX19KShjKTt2YXIgTWE9CmMubWt8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5GYT10aGlzLiRkPSExfWMud2o9YjtiLnByb3RvdHlwZT17RHU6ZnVuY3Rpb24oYSl7dGhpcy4kZD1hfSxDdTpmdW5jdGlvbihhKXt0aGlzLkZhPWF9LGp1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSIsInJlZ2lzdGVyaW5ncyBldmVudDoiLGIpO2EuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe2NvbnNvbGUubG9nKCJVVElMUyIsInB1Ymxpc2hlckFQSSBnb3QgZXZlbnQiLGIsYSl9KX12YXIgYj17bXg6IkFkQ2xpY2tUaHJ1IixveDoiQWRFcnJvciIscHg6IkFkU3RvcHBlZCIsc3g6IkFkTGluZWFyQ2hhbmdlIix0eDoiQWRUYWdQYXJzZWQiLHd4OiJBZFZpZGVvQ29tcGxldGUiLHp4OiJBZExvYWRlZCIsQXg6IkFkU2tpcHBlZCIsQng6IkFkU3RhcnRlZCIscXg6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixyeDoiQWRJbXByZXNzaW9uIixueDoiQWRDcmVhdGl2ZVZpZXciLAp1eDoiQWRWaWRlb01pZHBvaW50Iix2eDoiQWRQYXVzZWQiLHh4OiJBZFZpZGVvU3RhcnQiLHl4OiJBZFBsYXlpbmcifTt3aW5kb3cuc21hcnRjbGllbnRjb3JlJiZ3aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UJiYoYj13aW5kb3cuc21hcnRjbGllbnRjb3JlLkVWRU5UKTtmb3IodmFyIGQgaW4gYiliLmhhc093blByb3BlcnR5KGQpJiZhKHRoaXMuJGQsYltkXSl9LGl1OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2NvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsInJlZ2lzdGVyaW5nIGV2ZW50OiIsYik7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIixiLGEpfSl9aWYodGhpcy5GYSYmdGhpcy5GYS5aZClmb3IodmFyIGIgaW4gdGhpcy5GYS5aZCl0aGlzLkZhLlpkLmhhc093blByb3BlcnR5KGIpJiZhKHRoaXMuRmEsdGhpcy5GYS5aZFtiXSk7dGhpcy5GYSYmdGhpcy5GYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuRmEuZ2V0RXJyb3IoKTthJiZjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLCJnb3QgZXJyb3IiLGEpfS5iaW5kKHRoaXMpLDEwKX0sZjpmdW5jdGlvbigpe3RoaXMuJGQmJnRoaXMuanUoKTt0aGlzLkZhJiZ0aGlzLml1KCl9fX0pKGMpO3ZhciBOYT1jLndqfHxOYTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuVWE9ITE7dGhpcy55Yz0iIjt0aGlzLm5lPXRoaXMueGM9dGhpcy55Yj1udWxsO3RoaXMueHA9dGhpcy5LYj10aGlzLnJoPSExO3RoaXMuSmE9IiI7dGhpcy5taD0hMTt0aGlzLnZhPXRoaXMucmQ9IiI7dGhpcy5paD10aGlzLlk9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mZj0hMTt0aGlzLkJhPVtdO3RoaXMuWGc9dGhpcy5nYz0iIjt0aGlzLnZlPSExO3RoaXMueGY9MDt0aGlzLk5mPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfVkVSSUZJRUQiO3RoaXMuTGY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLlFiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjsKdGhpcy5vYz0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0FEQkxPQ0tFUiI7dGhpcy5NZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0NPT0tJRUJMT0NLRVIiO3RoaXMuaWM9IiI7dGhpcy5qYz1bXTt0aGlzLmtjPVtdO3RoaXMuT2Q9W107dGhpcy5oYz0iIjt0aGlzLnlmPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuSGM9ITE7dGhpcy5ncD10aGlzLlRkPW51bGw7dGhpcy5UaD10aGlzLm1jPXRoaXMuemc9dGhpcy5CZj10aGlzLlJkPXRoaXMucGU9dGhpcy5xYz0hMTt0aGlzLmpiPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnNkPTA7dGhpcy5aZz0hMTt0aGlzLllnPTFFMzt0aGlzLmFkPSExO3RoaXMuUWE9MUUzO3RoaXMuVmY9IiJ9Yy5uaz1iO2IucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5VYSxhZHRhZ3BhcmFtZXRlcjp0aGlzLnljLGFkdGFnbW9kaWZpZXI6dGhpcy55YixhZHRhZ21vZGlmaWVyQWR2OnRoaXMueGMsCmFkdGFncmVnZXg6dGhpcy5uZSxiaXRyYXRlOnRoaXMuUWEsanNwb3B1cHM6dGhpcy5yaCxzaWRlbG9hZHM6dGhpcy5LYixkaXNhYmxldGVzdHM6dGhpcy54cCxob21hZEFsaWFzOnRoaXMuSmEsaXNJbml0aWFsaXplZDp0aGlzLm1oLGdsb2JhbENvbmZpZzp0aGlzLnJkLGNsaWVudENvbmZpZzp0aGlzLnZhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5paCxzZXJ2ZXI6dGhpcy5CYSxzdm1Db25maWc6dGhpcy5nYyxob21hZEFkcGF0aDp0aGlzLlhnLGRpc2FibGVDb29raWVUZXN0OnRoaXMudmUsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMueGYsSE9NQURfVkVSSUZJRUQ6dGhpcy5OZixIT01BRF9CTE9DS0VEOnRoaXMuTGYsSE9NQURfTk9CTE9DS0VSOnRoaXMuUWIsSE9NQURfQURCTE9DS0VSOnRoaXMub2MsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLk1mLHRlc3RIaWRlOnRoaXMuaWMsdGVzdFRhZ3M6dGhpcy5qYyx0ZXN0VGFnc0pTOnRoaXMua2MsCnRlc3RUYWdzWEhSOnRoaXMuT2QsdGVzdENvb2tpZTp0aGlzLmhjLHRocm90dGxlOnRoaXMueWYsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5IYyxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLmdwLGFkQmxvY2tlckRldGVjdGVkOnRoaXMucWMsYmxvY2tlZFdhc0NhbGxlZDp0aGlzLnBlLHVzZVN0cmljdENoZWNrczp0aGlzLlJkLHVzZVN0cmljdENvbmZpZ0NoZWNrczp0aGlzLkJmLGNvbmZpZ0ZhaWx1cmVzOnRoaXMuamIsc2l0ZUNvbmZpZzp0aGlzLkRhLHNlcnZlcklkOnRoaXMuUWgsZW5hYmxlUXVhcnRpbGVUcmFja2luZzp0aGlzLmxiLHZwYWlkOnRoaXMubWMsc2tpcEFsbG93ZWQ6dGhpcy5UaCx2bWFwczp0aGlzLnRpLGFsdGVybmF0ZV9jbGlja3Rocm91Z2g6dGhpcy5hZCxhZEZhbGxiYWNrVVJMOnRoaXMuVmZ9fSxscjpmdW5jdGlvbigpe3ZhciBhPSExLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYKMT09dGhpcy5qYltiXSYmKGE9ITApO3JldHVybiBhfSxsZjpmdW5jdGlvbihhKXt0aGlzLmpiW2FdPSEwfSxUcTpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5qYikiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLmpiW2JdJiYxPT10aGlzLmpiW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LE5kOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhO2E9YS5yZXBsYWNlKCJbdGltZV0iLE1hdGgucm91bmQoKG5ldyBEYXRlKS5nZXRUaW1lKCkvMUUzKSk7YT1hLnJlcGxhY2UoIlt0aW1lTVNdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIlt0aW1lc3RhbXBdIiwobmV3IERhdGUpLmdldFRpbWUoKSk7YT1hLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkliKDEwKS50b1N0cmluZygpKTthPWEucmVwbGFjZSgiW2RvY3VtZW50VVJMXSIsZG9jdW1lbnQuVVJMKTthPWEucmVwbGFjZSgiW2RvY3VtZW50QmFzZVVSSV0iLGRvY3VtZW50LmJhc2VVUkkpOwpyZXR1cm4gYT1lLkRvKGEpfSx6YTpmdW5jdGlvbihhLGIsZCl7dmFyIGY9IiIsYz0iIixlPSIiLGc9IiI7aWYoIXRoaXMuVWEmJiFiKXJldHVybiBuZXcgeihhKTtmPXRoaXMuTWUoYSk7Yz10aGlzLnhhKGEpO2Y/KHRoaXMudWQoKT9lPWE6ZT1jLnByb3RvY29sKyI6Ly8iK2MuYXV0aG9yaXR5KyIvIixnPWMucGF0aC5zdWJzdHIoMSkpOihlPXRoaXMuRmQoKSxnPWMucGF0aC5zdWJzdHIoMSkrKGMucXVlcnk/Ij8iK2MucXVlcnk6IiIpKTtkJiYodGhpcy55Y3x8dGhpcy55Ynx8dGhpcy54Y3x8dGhpcy5uZSkmJihnPXRoaXMuS3MoZykpO2E9bmV3IHooZSk7YS51cmw9ZTtlPSIiO2U9Zj9jLmhvc3Quc3BsaXQoIi4iKS5zbGljZSgxKS5qb2luKCItIik6dGhpcy5VcShjLmhvc3QpO2EuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWU7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZzthLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihnKTthLm1ldGhvZD0iUE9TVCI7CnJldHVybiBhfSxNZTpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMudWQoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/LyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpLChkPWQuZXhlYyhhKSkmJmRbNF0mJihiPSEwKSk7cmV0dXJuIGJ9LHVkOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0iIjt0aGlzLkJhJiZ0aGlzLkJhLmxlbmd0aCYmMDx0aGlzLkJhLmxlbmd0aCYmKGI9dGhpcy5CYVswXSxiPWIucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKSxiPWIucmVwbGFjZSgiaHR0cDovLyIsIiIpLGI9Yi5yZXBsYWNlKCIvLyIsIiIpLGE9KGE9Yi5zcGxpdCgiLiIpKSYmYVswXSYmIltoYXNoXSI9PWFbMF0/ITE6ITApO3JldHVybiBhfSxOZTpmdW5jdGlvbihhKXt2YXIgYj0KITEsZD1SZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8uKiIsImciKS5leGVjKGEpO2QmJihkWzJdfHxkWzVdKT9iPSEwOmI9dGhpcy5NZShhKTtyZXR1cm4gYn0sVXE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0iIjtpZigic3RyaW5nIj09PXR5cGVvZiB0aGlzLkphJiYwPHRoaXMuSmEubGVuZ3RoKXJldHVybiB0aGlzLkphO2ZvcihkIGluIHRoaXMuSmEpaWYoYj10aGlzLkphW2RdLGIuaGFzT3duUHJvcGVydHkoInVybCIpJiZiLnVybD09PWEpcmV0dXJuIGIuSXg7cmV0dXJuIm5vbmUifSx0ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJhW3RoaXMuUWhdfSxGZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGQoKSxiPXRoaXMuU2goKG5ldyBEYXRlKS5nZXRUaW1lKCkrIiIpLGQ9IjFhYmNkZiIuc3BsaXQoIiIpO3JldHVybiBhLnJlcGxhY2UoIltoYXNoXSIsYi5zbGljZSgwLC0xKSsiIitkW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSpkLmxlbmd0aCldKX0sd2g6ZnVuY3Rpb24oYSwKYixkKXthPSExO2I9IiI7aWYoZC5ldmFsKXRyeXtiPWV2YWwoIigiK2QuZXZhbCsiKSgpIil9Y2F0Y2goZil7YT0hMH1lbHNlIGE9ITA7YSYmIktFRVAiIT09ZC5mYWxsYmFjayYmKGI9ZC5mYWxsYmFjayk7cmV0dXJuIGJ9LEpzOmZ1bmN0aW9uKGEsYil7dmFyIGQ9ZS54YShhKSxmPSIiLGY9IiIsYztmb3IoYyBpbiBiKXtpZihiW2NdLnN1YnZhbHVlcyl7Zm9yKHZhciBnPWRlY29kZVVSSUNvbXBvbmVudChkLnF1ZXJ5S2V5W2NdKS5zcGxpdCgiJiIpLGY9e30sSD0wO0g8Zy5sZW5ndGg7SCsrKXt2YXIgaz1nW0hdLnNwbGl0KCI9Iik7ZltrWzBdXT1rWzFdfWZvcih2YXIgbCBpbiBiW2NdLnN1YnZhbHVlcylmW2xdPXRoaXMud2goZltsXSxsLGJbY10uc3VidmFsdWVzW2xdKTtnPVtdO2ZvcihsIGluIGYpZy5wdXNoKGwrIj0iK2ZbbF0pO2Y9Zz1lbmNvZGVVUklDb21wb25lbnQoZy5qb2luKCImIikpfWVsc2UgZj10aGlzLndoKGQucXVlcnlLZXlbY10sYyxiW2NdKTtkLnF1ZXJ5S2V5W2NdPQpmfWw9W107Zm9yKGMgaW4gZC5xdWVyeUtleSlsLnB1c2goYysiPSIrZC5xdWVyeUtleVtjXSk7cmV0dXJuIGY9ZC5ob3N0K2QucGF0aCsiPyIrbC5qb2luKCImIil9LEtzOmZ1bmN0aW9uKGEpe3RoaXMueWMmJihhKz10aGlzLnljKTtpZih0aGlzLnliKWZvcih2YXIgYiBpbiB0aGlzLnliKXRoaXMueWIuaGFzT3duUHJvcGVydHkoYikmJihhPWEucmVwbGFjZShiLHRoaXMueWJbYl0pKTt0aGlzLnhjJiYoYT10aGlzLkpzKGEsdGhpcy54YykpO3JldHVybiBhfSxjcDpmdW5jdGlvbigpe3RoaXMuRGEmJnRoaXMuRGEuY2xpZW50QVBJcyYmdGhpcy5Zbyh0aGlzLkRhLmNsaWVudEFQSXMpfSxZbzpmdW5jdGlvbihhKXtpZihhKXt2YXIgYj1uZXcgTmE7YS5wdWJsaXNoZXJBUEkmJmIuRHUoYS5wdWJsaXNoZXJBUEkpO2EucGxheWVyJiZiLkN1KGEucGxheWVyKTtiLmYoKX19LGw6ZnVuY3Rpb24oYSxiLGQsZixjLGUpe2w9dGhpczt0aGlzLm1oPSEwO3RoaXMucmQ9YTt0aGlzLnZhPWI7dGhpcy5mZj0KZDt0aGlzLlRkPWY7dGhpcy5DYz1jO3RoaXMuRGE9ZXx8e307dGhpcy5jcCgpO3RoaXMuQnMoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMudmEpdGhpcy56cygpO2Vsc2V7aWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy52YSl0cnl7dGhpcy52YT1iKCksdGhpcy56YygpfWNhdGNoKGcpe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9aWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnZhKXRyeXt0aGlzLnZhPWIsdGhpcy56YygpfWNhdGNoKGspe3RoaXMuaGEoIm5vQ2xpZW50Q29uZmlnIil9fX0scmI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LEJzOmZ1bmN0aW9uKCl7dGhpcy5LYShuZXcgeih0aGlzLnJkK3RoaXMua2UoImdsb2JhbCIpKSx0aGlzLmhyLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJnbG9iYWwiKTsKIm9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLnpjKCl9LmJpbmQodGhpcyksITApfSx6czpmdW5jdGlvbigpe3RoaXMuS2EobmV3IHoodGhpcy52YSt0aGlzLmtlKCJjbGllbnQiLC0xIT10aGlzLnZhLmluZGV4T2YoIj8iKSkpLHRoaXMuemMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMubGYoImNsaWVudCIpO3RoaXMuaGEoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LGtlOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5JYigpKTt0aGlzLkRhJiZ0aGlzLkRhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5EYSYmdGhpcy5EYS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGhhOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLnBlKXt0aGlzLnBlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goaCl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT0Kd2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTsiNHBsYXllcnMuZGUiPT1lLkdjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpJiYodGhpcy5DYz0hMSk7dGhpcy5DYyYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLkNjP3RoaXMuQ2MoKTooYigpLHdpbmRvdy5zZXRJbnRlcnZhbChiLDUwMCkpO3RoaXMuWT10aGlzLmloPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLkxmKSk7dGhpcy5OYigpO2UuRWMoay5FdCk7KGI9ZS5HYyh0aGlzLnRkKCkpKXx8KGI9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0saHI6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9CnRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuaXNFbmFibGVkPyJvYmplY3QiIT10eXBlb2YgdGhpcy52YXx8dGhpcy5nY3x8dGhpcy5KYXx8dGhpcy56YygpOih0aGlzLlVhPXRoaXMuaXNFbmFibGVkPSExLHRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMuTmIoKSl9fSx6YzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLnZhfWVsc2UgYT10aGlzLnZhO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQmE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkJhLmxlbmd0aDtiKyspdGhpcy5CYVtiXT10aGlzLkJhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTsKdGhpcy5nYz1hLmNvbmZpZ3x8IiI7dGhpcy5KYT1hLmFsaWFzfHxudWxsO3RoaXMuWGc9YS5hZHBhdGh8fCIiO3RoaXMudmU9YS5kaXNhYmxlY29va2lldGVzdHx8ITE7dGhpcy5RaD1NYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqdGhpcy5CYS5sZW5ndGgpO3RoaXMuaXNFbmFibGVkJiZ0aGlzLmdjJiZ0aGlzLkphJiZ0aGlzLkJhLmxlbmd0aD90aGlzLkpjKCExKToodGhpcy5VYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKSx0aGlzLk5iKCkpfSxKYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLkZkKCkpLGQ9dGhpcy54YSh0aGlzLmdjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLAoiIik7Yi5tZXRob2Q9IlBPU1QifWVsc2UgYj1uZXcgeih0aGlzLmdjK3RoaXMua2UoImN1c3RvbWVyIikpO3RoaXMuS2EoYix0aGlzLmR2LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmxmKCJjdXN0b21lciIpO2E/dGhpcy5YbD90aGlzLmhhKCJub1NWTUNvbmZpZyIpOih0aGlzLlhsPSEwLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KYyghMCl9LmJpbmQodGhpcyksMTAwKSk6dGhpcy5KYyghMCl9LmJpbmQodGhpcyksITApfX0sZHY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5IYz0hMDt0aGlzLkpjKCEwKTtyZXR1cm59fXRoaXMuUmQ9dGhpcy5mYihiLnN0cmljdCk7dGhpcy5CZj10aGlzLmZiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnpnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8CiExO3RoaXMubGI9dGhpcy5mYihiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcpO3RoaXMuaXNFbmFibGVkPXRoaXMuZmIoYi5lbmFibGVkKTt0aGlzLmljPWIudGVzdGhpZGV8fCIiO3RoaXMua2M9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PZD1iLnRlc3RhZHRhZ3N4aHJ8fFtdO3RoaXMueWM9Yi5hZHRhZ3BhcmFtZXRlcnx8IiI7dGhpcy55Yj1iLmFkdGFnbW9kaWZpZXJ8fG51bGw7dGhpcy54Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMubmU9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMucmg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5LYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5tYz1iLnZwYWlkfHwhMTt0aGlzLkRhLnZwYWlkPXRoaXMubWM7dGhpcy5UaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLmJkPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy50aT1iLnZtYXBzfHwiIjt0aGlzLmFkPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5RYT0KYi5iaXRyYXRlfHwxRTM7dGhpcy5WZj1iLmFkX2ZhbGxiYWNrX1VSTHx8IiI7dGhpcy5oYz1iLnRlc3QzcmRwYXJ0eWNvb2tpZSYmYi50ZXN0M3JkcGFydHljb29raWUgaW5zdGFuY2VvZiBBcnJheT90aGlzLmFyKGIudGVzdDNyZHBhcnR5Y29va2llKTpiLnRlc3QzcmRwYXJ0eWNvb2tpZXx8IiI7dGhpcy52ZSYmKHRoaXMuaGM9bnVsbCk7dGhpcy55Zj1iLnRocm90dGxlfHwwO3RoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemF8fHt9OyF0aGlzLkhjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5IYz0hMCx0aGlzLkpjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLnR2KCkmJih0aGlzLmljfHx0aGlzLmtjfHx0aGlzLmpjfHx0aGlzLmhjfHx0aGlzLk9kKT90aGlzLmZmPyh0aGlzLlVhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy5RYikpLHRoaXMucmUoKSx0aGlzLk5iKCkpOnRoaXMuaHYoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5pdigpKX19LApodjpmdW5jdGlvbigpe3RoaXMuZ3YoKTt0aGlzLmp2KCl9LGp2OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhKXtyZXR1cm4idmFyIGV2dCA9IHt9O2lmICh0eXBlb2Ygd2luZG93LkN1c3RvbUV2ZW50ID09PSAnZnVuY3Rpb24nKSB7ZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KCciK2ErIicpO30gZWxzZSB7ZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7ZXZ0LmluaXRDdXN0b21FdmVudCgnIithKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsCmZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJkYXRhIiwiIil9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImV2YWwiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoSCxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiaW5saW5lIiwiIil9KTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGYpO2YuY29udGVudFdpbmRvdy5kb2N1bWVudC53cml0ZShhdG9iKCJQR2gwYld3K1BHaGxZV1ErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBnPT0iKSthKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnpiKGEoYykpKwphdG9iKCJJajQ4TDNOamNtbHdkRDQ4TDJobFlXUStQR0p2WkhrK1BDOWliMlI1UGp3dmFIUnRiRDQ9IikpfWNhdGNoKGspe313aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGYpfWNhdGNoKGEpe31pZigzIT1kKXt2YXIgYz1lLmxkKCk7aWYoKGMuaXNDaHJvbWV8fGMuaXNGaXJlZm94KSYmIWMuaXNFZGdlJiYhZS5WYSgpKXtpZih0aGlzLkRhJiZ0aGlzLkRhLnBsYXllciYmdGhpcy5EYS5wbGF5ZXIubGVuZ3RoKXtlLnRyYWNrKCJzdGF0c19oZF9jc3BfaGRwIixiLCEwKTtyZXR1cm59dGhpcy5oYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0saXY6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuUWIpKTt0aGlzLk5iKCl9LFFjOmZ1bmN0aW9uKGEpe3RoaXMucWM9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuVWE9ITAsCmRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYihhKSksdGhpcy5OYigpLHRoaXMucmUoKSl9LGd2OmZ1bmN0aW9uKCl7aWYodGhpcy5pYyl7dmFyIGE9ZS5sZCgpO2lmKChhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJnRoaXMucWgoKSl0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBzdGV2ZSBpcyBhbGl2ZSIpO2Vsc2V7YT0hMTt0cnl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yi5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLmljKTtiLnNldEF0dHJpYnV0ZSgiaWQiLHRoaXMuaWMpO2Iuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7CmE9ZH1jYXRjaChmKXt9YT90aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZEhpZGUoKSBhZCBlbGVtZW50IHdhcyBoaWRkZW4iKTp0aGlzLmJpKCl9fWVsc2UgdGhpcy5iaSgpfSxhaTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5JYigpKTt0aGlzLm12KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy51Zi5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuUWModGhpcy5vYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbCgpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmpjPXRoaXMuT2QpJiZ0aGlzLmpjLmxlbmd0aCl7dmFyIGQ9dGhpcy5qYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnVmKCl9LG12OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLAohMCk6ITF9dmFyIGU9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dGhpcy5LYShuZXcgeihhKSxmLGZ1bmN0aW9uKCl7YygpJiZkKCl9KX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuSWIoKSk7dGhpcy5udihmLDA8ZC5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuYWkuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLlFjKHRoaXMub2MsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGxKUygpIGFkIGNhbGwgdG8gJyIrZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMua2MmJnRoaXMua2MubGVuZ3RoKXt2YXIgZD10aGlzLmtjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuYWkoKX0sbnY6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLAohMCk6ITF9dmFyIGc9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsaCl7aD09YSYmZSgpJiZjKCl9O3ZhciBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoayk7ay5zZXRBdHRyaWJ1dGUoImFzeW5jIiwiYXN5bmMiKTtrLnNldEF0dHJpYnV0ZSgiZGVmZXIiLCJkZWZlciIpO2sub25sb2FkPWY7ay5vbmVycm9yPWM7ay5zcmM9YTtrLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixjKX1jYXRjaChsKXtmKCl9fSx1ZjpmdW5jdGlvbigpe3RoaXMuaGM/KHRoaXMueGYrKyx0aGlzLkthKG5ldyB6KHRoaXMuaGMpLHRoaXMuZnYuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMudmYoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5aaCgpfSx2ZjpmdW5jdGlvbihhKXt0aGlzLlFjKHRoaXMuTWYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiKwphKX0sZnY6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMueGY/dGhpcy51ZigpOnRoaXMudmYoIkJCQiIpOiJhbHJlYWR5LXNldCI9PWIuc3RhdHVzJiZ0aGlzLlpoKCk6dGhpcy52ZigiQUFBIil9LFpoOmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlFiKSk7dGhpcy5OYigpO3RoaXMucmUoKX0scWg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxOYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5WYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLnFjJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsCmErIiIrYiwhMCk7IXRoaXMucWMmJmUudGEoIndlbHQuZGUiKSYmZS5abygpOyIxIj09PWImJihlLnRhKCJ0LW9ubGluZS5kZSIpfHxlLnRhKCJnaWdhLmRlIil8fGUudGEoIndlbHQuZGUiKSkmJmUudHJhY2soInN0YXRzX2hkX2FiX2lzU3RldmUiLHRoaXMucWgoKSwhMCk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuTmYpKTt0aGlzLlRkJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuVGQmJnRoaXMuVGQoKX0sYnA6ZnVuY3Rpb24oKXtpZih0aGlzLkJmJiZ0aGlzLmxyKCkpe3ZhciBhPXRoaXMuVHEoKTthJiZhLmpvaW4mJmUudHJhY2soImNvbmZpZ19mYWlsZWQiLGEuam9pbigiXyIpLCEwKX19LGZpOmZ1bmN0aW9uKGEpe2F8fChhPSIiKTtpZigic3RyaW5nIiE9PXR5cGVvZiBhKXRyeXthPWEudG9TdHJpbmcoKX1jYXRjaChiKXthPSJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLAohMCl9LEthOmZ1bmN0aW9uKGEsYixkLGYsYyxnKXt0aGlzLnNkfHwodGhpcy5zZD0wKTt0aGlzLnNkKys7dGhpcy5zZD50aGlzLllnJiYhdGhpcy5aZyYmKHRoaXMuWmc9ITAsZS50cmFjaygic3RhdHNfaGRfcmVxdWVzdGNvdW50Iix0aGlzLllnLCEwKSk7YT1uZXcgTWEoYSxiLGQpO2YmJihhLndpPSEwKTtjJiZlLmRzKCkmJihhLkpnPSEwKTtnJiYoYS5ZaD0hMCk7cmV0dXJuIGEubG9hZCgpfSwkbzpmdW5jdGlvbigpe2UuVmEoKXx8ZS5hYigiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGwsZj0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goYyl7dGhpcy5oYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihkKWlmKGE9ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7Zj1hJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIiO3RoaXMudWQoKXx8KGE9dGhpcy54YShmKSxmPWEucHJvdG9jb2wrIjovLyIrYS5ob3N0KTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7ZS5uZXR3b3JrU3RhdGU9PWUuTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuaGEoIm1lZGlhZmlsZSIpfS5iaW5kKHRoaXMpKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpKTtlLnNldEF0dHJpYnV0ZSgic3JjIixmKX1lbHNlIHRoaXMuaGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmhhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5oYSgibWVkaWFmaWxlX25vYWQiKX0uYmluZCh0aGlzKSwKZnVuY3Rpb24oKXt0aGlzLmhhKCJtZWRpYWZpbGVfeG1scmVxdWVzdCIpfS5iaW5kKHRoaXMpLHRoaXMpfSxldjpmdW5jdGlvbigpe3JldHVybiJhbGwiPT09dGhpcy50aX0sYXA6ZnVuY3Rpb24oKXt0aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLnphKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkthKGEsdGhpcy5jdy5iaW5kKHRoaXMpLHRoaXMuYncuYmluZCh0aGlzKSl9LGN3OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsZD1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7cmV0dXJufWR8fHRoaXMubnEoKX0sYnc6ZnVuY3Rpb24oKXt9LG5xOmZ1bmN0aW9uKCl7ZS5FYyhrLm1xKTtlLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmhhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLktiLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMuS2IubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5LYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZS5hYihiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKTtpZigiZXZhbCI9PWIudHlwZSl7dmFyIGQ9bmV3IEo7d2luZG93W2QuamEoKV09dGhpcztlLmFiKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbihhKXtpZihhLnJlc3BvbnNlVGV4dCl0cnl7ZXZhbChhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYil7fX0sZnVuY3Rpb24oKXt9LAp0aGlzKX19fSx0djpmdW5jdGlvbigpe3JldHVybiAxMDAqTWF0aC5yYW5kb20oKTx0aGlzLnlmfSxhcjpmdW5jdGlvbihhKXtyZXR1cm4gYVtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqYS5sZW5ndGgpXX0sSWI6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sYWE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsZD0wO2Q8YTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LGZiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHpiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYsYyxlLGcsayxsPTA7bDxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQobCsrKSxmPWEuY2hhckNvZGVBdChsKyspLGM9YS5jaGFyQ29kZUF0KGwrKyksCmU9ZD4+MixkPShkJjMpPDw0fGY+PjQsZz0oZiYxNSk8PDJ8Yz4+NixrPWMmNjMsaXNOYU4oZik/Zz1rPTY0OmlzTmFOKGMpJiYoaz02NCksYj1iKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGUpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGQpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGcpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBifSx4YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSxTaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBkPSIiLGgsYztmb3IoaD03OzA8PWg7aC0tKWM9YT4+PjQqaCYxNSxkKz1jLnRvU3RyaW5nKDE2KTtyZXR1cm4gZH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYsYyxlPUFycmF5KDgwKSwKZz0xNzMyNTg0MTkzLGs9NDAyMzIzMzQxNyxsPTI1NjIzODMxMDIsbT0yNzE3MzM4Nzgscj0zMjg1Mzc3NTIwLG4scCx1LHQsdjtuPWEubGVuZ3RoO3ZhciB3PVtdO2ZvcihmPTA7ZjxuLTM7Zis9NCljPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHcucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHcucHVzaChmKTsxNCE9dy5sZW5ndGglMTY7KXcucHVzaCgwKTt3LnB1c2gobj4+PjI5KTt3LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTsKZm9yKGE9MDthPHcubGVuZ3RoO2ErPTE2KXtmb3IoZj0wOzE2PmY7ZisrKWVbZl09d1thK2ZdO2ZvcihmPTE2Ozc5Pj1mO2YrKyllW2ZdPWQoZVtmLTNdXmVbZi04XV5lW2YtMTRdXmVbZi0xNl0sMSk7Yz1nO249aztwPWw7dT1tO3Q9cjtmb3IoZj0wOzE5Pj1mO2YrKyl2PWQoYyw1KSsobiZwfH5uJnUpK3QrZVtmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj0yMDszOT49ZjtmKyspdj1kKGMsNSkrKG5ecF51KSt0K2VbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NDA7NTk+PWY7ZisrKXY9ZChjLDUpKyhuJnB8biZ1fHAmdSkrdCtlW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2ZvcihmPTYwOzc5Pj1mO2YrKyl2PWQoYyw1KSsobl5wXnUpK3QrZVtmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD11LHU9cCxwPWQobiwzMCksbj1jLApjPXY7Zz1nK2MmNDI5NDk2NzI5NTtrPWsrbiY0Mjk0OTY3Mjk1O2w9bCtwJjQyOTQ5NjcyOTU7bT1tK3UmNDI5NDk2NzI5NTtyPXIrdCY0Mjk0OTY3Mjk1fXJldHVybihiKGcpK2IoaykrYihsKStiKG0pK2IocikpLnRvTG93ZXJDYXNlKCl9fX0pKGMpO3ZhciBPYT1jLm5rfHxPYSxsPW5ldyBPYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5OaT10aGlzLmFbN107dGhpcy5Gcj10aGlzLmFbM107dGhpcy5pdD10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs2XX1jLmF4PWI7Yi5wcm90b3R5cGU9e01pOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5OaTp0aGlzLkVyKGEpfSxFcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRnI6dGhpcy5odChhKX0saHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLml0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajoKYX19fSkoYyk7dmFyIFBhPWMuYXh8fFBhLEVjPW5ldyBQYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUVjLk1pKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZy5QP3RoaXMuYmI9YS5nLlAoKTp0aGlzLmJiPSIiO2EuZy5naCYmYS5nLmdoKHtwYXVzZTp0aGlzLkJkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuT2guYmluZCh0aGlzKSxtdXRlOnRoaXMuVmUuYmluZCh0aGlzKSx1bm11dGU6dGhpcy5Rdi5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmtiO3RoaXMucGxheWVyPXRoaXMuYi5nO3RoaXMuVmI9dGhpcy4kYz0hMTt0aGlzLnpvPTFFMzt0aGlzLnJhPW51bGw7dGhpcy5MPWI7dGhpcy5QYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuTGQ9e307ZS5xYigibmV3QmlnQWRJZCIpO3RoaXMuSW89CmUuYWEoMTApO3RoaXMucmY9MDt0aGlzLlljPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuWWM9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5iLmcpJiZ0aGlzLmIuZy51JiYoYT10aGlzLmIuZy51KCkpLHRoaXMuWWM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQ249ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5BaD10aGlzLktkPSExO3RoaXMudGg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLmplPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5hYz0hMTt0aGlzLnJwPWUuYWEoMTApO3RoaXMuSGI9ZS5hYSgxMCk7dGhpcy5GYj1lLmFhKDEwKTt0aGlzLlVoPWUuYWEoMTApO3RoaXMuY29uZj0Ke307dGhpcy5VZD10aGlzLk9iPXRoaXMudGU9dGhpcy5oZD10aGlzLnRmPXRoaXMudGI9dGhpcy5uYz10aGlzLkNoPXRoaXMubmQ9dGhpcy51dj10aGlzLndiPXRoaXMuR2I9ITE7dGhpcy50Yz1bXTt0aGlzLmRjPXt9O3RoaXMuQXQ9MjAwO3RoaXMuSWY9dGhpcy5KZj10aGlzLm9lPXRoaXMuSGY9dGhpcy5lZj0hMTt0aGlzLkFkPXt9fWMuaGs9YjtiLnByb3RvdHlwZT17dXU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEhhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy5iYl0mJnRoaXMuY29uZlt0aGlzLmJiXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuYmJdW2FdKTtyZXR1cm4gYn0sZ2k6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuJGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5aYSgpLCEwKTt0aGlzLk1kKCJjYWxsIix0aGlzLlphKCkpO2UudyhrLnRuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LFFlOmZ1bmN0aW9uKGEsCmIsZCxjKXt0aGlzLndiPWQ7dmFyIGc9ITE7YyYmYy5ob21hZF9yZXBsYWNlX3VybHNfaW5fdGFncyYmKGc9ITApO2lmKHRoaXMuTC5ZKXRoaXMucmYrKyxlLnFiKCJuZXdTbWFsbEFkSWQiKSx0aGlzLkwuYnAoKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlVhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLmdpKCksbmV3IFModGhpcyxhLHRoaXMudGgse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLlFhLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLm1jLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5nLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuZ2koKSxuZXcgUyh0aGlzLGEsdGhpcy50aCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5tYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuUWEsCmtlZXBVUkw6ITAsaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6Zyxjb250ZW50VmlkZW86e2R1cmF0aW9uOnRoaXMuYi5nLmdldER1cmF0aW9uKCksY3VycmVudFRpbWU6dGhpcy5iLmcuZ2V0Q3VycmVudFRpbWUoKX19KSk6dGhpcy5SYSgpO2Vsc2V7dmFyIHRjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3RjLlFlKGEsYixkKX0sNTApfX0sYWY6ZnVuY3Rpb24oYSl7YS4kYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLlVkPXRoaXMuT2I9dGhpcy5uZD0hMTt0aGlzLmM9YTt0aGlzLkl1KHRoaXMuYyk7dGhpcy5BZD1uZXcgUWEodGhpcy5jLmd3LHRoaXMudmlkZW8se30pO3RoaXMuVWcoYSk7dGhpcy50Yz10aGlzLkxnKGEpO3RoaXMubXAoKX0sVWc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuTGQ9dGhpcy5kcihhKSksdGhpcy5VZyhhLnBhcmVudCkpfSwKTGc6ZnVuY3Rpb24oYSl7dmFyIGM9W107YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksIWF8fCFhLnBhcmVudHx8YS5wYXJlbnQgaW5zdGFuY2VvZiBifHwoYz10aGlzLkxnKGEucGFyZW50KSksYy5wdXNoKHRoaXMuT3EoYSkpKTtyZXR1cm4gY30sT3E6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LGRyOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGQ9W10sYz1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2M9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpOwphLlUuZ2V0QXR0cmlidXRlKCJpZCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChnKSk7YS5VLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1hLlUuZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGcpKTtmb3IodmFyIGs9MDtrPGMubGVuZ3RoO2srKyljW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9Y1trXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxjW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1jW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKylkLnB1c2goYS5uYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmd9fSxxYTpmdW5jdGlvbihhKXthLiRhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLAphLmtkJiZhLmtkLmVycm9yJiZhLmtkLmVycm9yLmNvZGUmJihiPWEua2QuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5TYy5jb2RlOmI9PUYuYWUuY29kZT9lLncoay5Hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOihlLlJlKCksYj09Ri5RZi5jb2RlJiZlLncoay5Qcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKTtlLncoay5scSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuTWQoImVtcHR5Iix0aGlzLlphKCkpO3RoaXMuWGEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3Lk9mLmNvZGU6ZS53KGsuZHcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt0aGlzLlhhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUudyhrLkp3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgid3JhcHBlcmxpbWl0Iik7CmJyZWFrO2Nhc2Ugdy5iZS5jb2RlOmUudyhrLlN3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5YYSgieG1scGFyc2UiKTticmVhaztjYXNlIHcuWWQuY29kZTplLncoay5Rcyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuWGQuY29kZTplLncoay4kdix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1bW15YWQiKTticmVhaztjYXNlIHcuS2YuY29kZTplLncoay5hdyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMuWGEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlhhKCJ1bmtub3duIil9dGhpcy5XYihhKTt0aGlzLlJhKCl9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9CnsiW0VSUk9SQ09ERV0iOmJ9O2EuUGEubGVuZ3RoOyl0cnl7dmFyIGM9YS5QYS5wb3AoKTt0aGlzLlBlKGMudXJsLGMudHlwZSxiKX1jYXRjaChmKXt9fSxJdTpmdW5jdGlvbihhKXt0aGlzLnRlPSExO3RoaXMuUGI9dGhpcy5iLks7dmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuUGIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmcuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLmVmPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIuaHk9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiYKYi5zZXRBdHRyaWJ1dGUoZyx0aGlzLmNvbmZbInZpZGVvLmF0dHJpYnV0ZXMiXVtnXSk7dGhpcy5DbiYmdGhpcy5wbGF5ZXIuQWUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkFlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy54bihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuZWYmJmIubG9hZCgpO2lmKHRoaXMuY2koYikpe3RoaXMuTWQoInNldHVwIix0aGlzLlphKCkpO3RoaXMuQW4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT0KdGhpcy5QYi5hcHBlbmRDaGlsZChhKTt0cnl7dGhpcy5lZj90aGlzLnZpZGVvPWI6dGhpcy52aWRlbz10aGlzLnJhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMubnAoKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLlBiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChiKSx0aGlzLkd1KCkpOnRoaXMuYy5vcmlnaW4uQWcody5ZZCl9LEd1OmZ1bmN0aW9uKCl7dGhpcy5IZj0hMDt0aGlzLnRiPXRoaXMubmM9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihlLncoay5zZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudGI9ITApO2Uuc2UoKTt0aGlzLmMmJgp0aGlzLmMub3JpZ2luJiZ0aGlzLmMub3JpZ2luLnVhJiZlLkJuKHRoaXMuYy5vcmlnaW4udWEpO2UuaGIoInNldFVwVnBhaWQiKTt0aGlzLk1kKCJzZXR1cCIsdGhpcy5aYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLkRoKCk7dGhpcy5iLnBmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5wZigpO3RoaXMucmE9dGhpcy5QYj10aGlzLmIuSzt0aGlzLm9pKCJ2cGFpZCIpO2lmKHRoaXMudGIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5MYigibXV0ZWQiLCJjb250ZW50Iik7ZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX10aGlzLkg9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmcuc2EmJnRoaXMuYi5nLnNhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuZ3IoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLAp2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fGIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILAoiY29uZmlnIixnKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuamcoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTsKZS5sZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7IkFkU2l6ZUNoYW5nZSIhPWEuZGF0YS5uYW1lJiYiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIiE9WyJkYXRhIl0ubmFtZSYmdGhpcy5iLlpiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnRjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMudXcoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy52dygpLHRoaXMuYi5aYighMCksIXRoaXMuT2IpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuVWQ9CiEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5aYighMCksdGhpcy56dygpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuWmIoITApLHRoaXMuRHcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuQncoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuQ3coKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5FdygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5BdygpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy51aSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0OwpnfHwoZz10aGlzLmMuVWIpO2lmKCFnKXJldHVybjt0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIik7ZS53KGsucmcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLmFkJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnl3KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLncoay5oZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnd3KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5KZiYmCih0aGlzLklmPSExLHRoaXMuZmMoKSksdGhpcy54dygpKTsiQWRWb2x1bWVDaGFuZ2UiPT1hLmRhdGEubmFtZSYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYiksMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnRiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSk6KHRoaXMudGI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwidXNlciIpLGUudyhrLkFmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGUudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpfX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLApmdW5jdGlvbigpe3RoaXMuUmEoKX0uYmluZCh0aGlzKSk7ZS5sZSgidnBhaWRlcnJvcyIsZnVuY3Rpb24oKXt0aGlzLlJhKCl9LmJpbmQodGhpcykpO3RoaXMuYi5nZyhmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LHd3OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy50cmFjaygicGF1c2UiKTtlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5uYz0hMH0seHc6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpO3RoaXMubmM9ITF9LHp3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7CmUudyhrLmRnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHl3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSl9LHZ3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuaGIoImltcHJlc3Npb24iKTt0aGlzLlZoKCk7ZS53KGsuWmYsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRHc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuaGIoInN0YXJ0Iik7dGhpcy5ZYSgic3RhcnQiKTtlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxCdzpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLm5kPSEwO2UuaGIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIik7ZS53KGsuV2YsdGhpcy5jLkEsdGhpcy5iLmcudSgpLAp0aGlzLkMoKSx0aGlzLkIoKSl9LEN3OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygibWlkcG9pbnQiKTtlLmhiKCJtaWRwb2ludCIpO3RoaXMuWWEoIm1pZHBvaW50Iik7ZS53KGsuYWcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKX0sRXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5oYigidGhpcmRRdWFydGlsZSIpO3RoaXMuWWEoInRoaXJkUXVhcnRpbGUiKTtlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpfSxBdzpmdW5jdGlvbigpe3RoaXMuRGYoKTtlLmhiKCJjb21wbGV0ZSIpO3RoaXMuWWEoImNvbXBsZXRlIil9LHVpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuaGIoImFkc3RvcHBlZCIpO3RoaXMuWGEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7CmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKTtlLnNlKCk7dGhpcy5IPSExO3RoaXMuUmEoYSl9fSx1dzpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuWGEoInZwYWlkZXJyb3IiKTtlLmhiKCJlcnIiLGIpO2UudyhrLkZ3LHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy51aSghMCl9LHhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuVWEmJmIuaXNFbmFibGVkJiYhYi51ZCgpKXt2YXIgZD1iLnhhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTsKZi5zcmM9YyhiLHRoaXMuTCk7Zi5vbmVycm9yPXRoaXMubncuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sQW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMucGkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxHZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMucGkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5GZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMucmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5EZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLkVmLmJpbmQodGhpcykpfSxwaTpmdW5jdGlvbihhKXt0aGlzLlZifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmJ8fHRoaXMuRmYoYSl9LmJpbmQodGhpcyksdGhpcy56bykpfSxGZjpmdW5jdGlvbihhKXtpZighdGhpcy4kYyYmdGhpcy5jaSh0aGlzLnZpZGVvKSYmIXRoaXMuR2ImJiF0aGlzLlZiKXt0aGlzLiRjPSEwO3RyeXtpZighZS5WYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuR2J8fCh0aGlzLkdiPSEwLHRoaXMuR2QodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLlphKCksITApLHRoaXMuTC56Z3x8dGhpcy5MLmhhKCJ2aWRlby1ub29wIikpO3RoaXMuUmEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLlphKCksITApfXRoaXMuaXcoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5wZigpO3RoaXMuaHcoKTt0aGlzLm9pKCk7dGhpcy5rZygpO3RoaXMuYi5EaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5zZigpfX0sc2Y6ZnVuY3Rpb24oKXt0aGlzLmhkfHx0aGlzLlhmKCl9LFhmOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuaGR8fChhP3RoaXMuUmEoKToodGhpcy5WZSghMCksdGhpcy5YZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmVjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuZWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLmplfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5zZigpKX0uYmluZCh0aGlzKTt0aGlzLkNlKCkuUmgodGhpcyl9LERmOmZ1bmN0aW9uKCl7dGhpcy5MLmxiJiYhdGhpcy5HYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLllhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudyhrLnJuLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5SYSgpfSx1bjpmdW5jdGlvbihhKXtmb3IodmFyIGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChlLlBnKGFbY10pKTsKYT17aGFzaGVzOmJ9O2E9ay5UYShhLHRoaXMuQigpKTtlLlh1KGEpfSxSYTpmdW5jdGlvbihhKXt0aGlzLmMmJnRoaXMuYy5WZCYmdGhpcy51bih0aGlzLmMuVmQpO2lmKCF0aGlzLnRlKWlmKHRoaXMudGU9ITAsdGhpcy5VZHx8KGUudyhrLlNzLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy50cmFjaygibm90dmlld2FibGUiKSksdGhpcy5jLnZifHx0aGlzLmMucmMpe2UucWIoIm5ld1NtYWxsQWRJZCIpO3RoaXMucmYrKzt0aGlzLlZiPXRoaXMuJGM9ITE7dHJ5e3RoaXMuR2QodGhpcy52aWRlbyl9Y2F0Y2goYil7fXRyeXt0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pfWNhdGNoKGMpe310cnl7dGhpcy5QYi5yZW1vdmVDaGlsZCh0aGlzLnJhKX1jYXRjaChmKXt9dGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbDt0aGlzLktkPSExO3RyeXt0aGlzLmIubGkoKX1jYXRjaChnKXt9dGhpcy50Zj0hMDt0aGlzLmIuR2UoKTt0aGlzLmFjPQohMTt0aGlzLkNlKCkuTWgoKTt0aGlzLmMudmImJnRoaXMuYy5vcmlnaW4uV2UoKTt0aGlzLmMucmMmJihhP3RoaXMuYy5vcmlnaW4ueGgoKTp0aGlzLnVlKCkpfWVsc2UgdGhpcy51ZSgpfSxudzpmdW5jdGlvbihhKXthLnRhcmdldC5wYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGEudGFyZ2V0KTt0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkdkKHRoaXMudmlkZW8pLHRoaXMuRWYoYSkpfSxFZjpmdW5jdGlvbihhKXt0aGlzLlZiPSEwO2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJnRoaXMuTC4kbygpO3RoaXMuYy5vcmlnaW4uQWcody5ZZCl9LHJpOmZ1bmN0aW9uKCl7aWYodGhpcy51dil0aGlzLlJhKCk7ZWxzZXt0aGlzLmFjPSEwO3RoaXMuYi5nLkxhJiYKIXRoaXMudGYmJnRoaXMuYi5nLkxhKCkmJmUudyhrLmZkLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTt0aGlzLnh2KGEpO2lmKCF0aGlzLk9iKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuT2I9e2VsOnRoaXMudmlkZW8sY2I6ZnVuY3Rpb24oKXt0aGlzLlVkPSEwO2UudyhrLnNpLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy50cmFjaygidmlld2FibGUiKX0uYmluZCh0aGlzKSx0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkxlKHRoaXMuT2IpfWM9CiIiO3RoaXMuYy5xZiYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5VaCkpJiYoYz10aGlzLmMucWYtYSwwPGM/Yz10aGlzLmNvbmYuc2tpcGFibGVCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKTooYz10aGlzLmNvbmYuc2tpcEJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGMpLHRoaXMuS2R8fCh0aGlzLktkPSEwLGIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudyhrLmNnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7dGhpcy5jLnZiPyh0aGlzLlZiPXRoaXMuJGM9ITEsdGhpcy5HZCh0aGlzLnZpZGVvKSx0aGlzLnJhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMuUGIucmVtb3ZlQ2hpbGQodGhpcy5yYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLktkPSExLHRoaXMuYi5saSgpLHRoaXMuYy5vcmlnaW4uV2UoKSk6dGhpcy5SYSgpfS5iaW5kKHRoaXMpKSkpLApiLmlubmVySFRNTD1jKTt0aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKHRoaXMuYy5kdXJhdGlvbi1hKSkpO3RoaXMuamU9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlpOmZ1bmN0aW9uKCl7dGhpcy5DaHx8KHRoaXMuQ2g9ITAsdGhpcy5uZHx8ZS50cmFjaygic3RhdHNfaGRfY2xvc2VkQmVmb3JlMXN0UXVhcnRpbGUiLCIiLCEwKSl9LHh2OmZ1bmN0aW9uKGEpe2UudyhrLmhlLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSk7YT09dGhpcy5qaXx8dGhpcy5HYnx8KDA9PWEmJih0aGlzLndiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLndiKSx0aGlzLndiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLApmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksdGhpcy5HYnx8dGhpcy5WaCgpLHRoaXMudHJhY2soImNyZWF0aXZlVmlldyIpLHRoaXMudHJhY2soInN0YXJ0IiksdGhpcy5MLmxiJiZ0aGlzLllhKCJzdGFydCIpLGUudyhrLlpmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksZS53KGsuZGcsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsImZpcnN0UXVhcnRpbGUiLCEwKSx0aGlzLllhKCJmaXJzdFF1YXJ0aWxlIiksdGhpcy5uZD0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGUudyhrLldmLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5jLmR1cmF0aW9uLzIpJiYodGhpcy5MLmxiJiYoZS50cmFjaygicXVhcnRpbGUiLCJtaWRwb2ludCIsCiEwKSx0aGlzLllhKCJtaWRwb2ludCIpKSx0aGlzLnRyYWNrKCJtaWRwb2ludCIpLGUudyhrLmFnLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSkpLGE9PU1hdGguZmxvb3IoMyp0aGlzLmMuZHVyYXRpb24vNCkmJih0aGlzLkwubGImJihlLnRyYWNrKCJxdWFydGlsZSIsInRoaXJkUXVhcnRpbGUiLCEwKSx0aGlzLllhKCJ0aGlyZFF1YXJ0aWxlIikpLHRoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKSxlLncoay5lZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKSx0aGlzLmppPWEpfSxNZDpmdW5jdGlvbihhLGIpe2UudHJhY2soInN0YXRzX2hkX2FkXyIrYSxiLCEwKX0sVmg6ZnVuY3Rpb24oKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uIix0aGlzLlphKCksITApfSxYYTpmdW5jdGlvbihhKXtlLnRyYWNrKCJzdGF0c19oZF9hZF9lcnJvciIsYSwhMCl9LFlhOmZ1bmN0aW9uKGEpeyh0aGlzLkhmfHx0aGlzLkwubGIpJiYKZS50cmFjaygic3RhdHNfaGRfYWRfcXVhcnRpbGVfIithLHRoaXMuWmEoKSwhMCl9LExiOmZ1bmN0aW9uKGEsYil7dGhpcy5MLmxiJiZlLnRyYWNrKCJzdGF0c19oZF8iK2EsYiwhMCl9LHRyYWNrOmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMuR2Ipe3RoaXMuQWQmJnRoaXMuQWQudHJhY2smJnRoaXMuQWQudHJhY2soYSk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfXZhciBjPVtdO3RyeXtjPXRoaXMuZXIodGhpcy5jLlBhLGEpfWNhdGNoKGYpe2M9W119Zm9yKDtjLmxlbmd0aDspdHJ5e3ZhciBnPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiYodGhpcy5vZT0hMCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLkxkLmltcHJlc3Npb25zJiZlLmJzKGcudXJsLHRoaXMuTGQuaW1wcmVzc2lvbnMpP3RoaXMuUGUoZy51cmwsZy50eXBlLHt9LApmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLncoay5zbix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCkse2FkSWQ6dGhpcy5MZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5CKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuUGUoZy51cmwsZy50eXBlKX1jYXRjaChsKXt9aWYoIWIpdHJ5e3RoaXMuYy5QYT10aGlzLnZwKHRoaXMuYy5QYSxhKX1jYXRjaChtKXt9fX0sWmE6ZnVuY3Rpb24oKXt2YXIgYT1lLlZhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLGI9IiI7dGhpcy5IZiYmKGI9Il92cGFpZCIpO3RoaXMuSmYmJihiPSJfd2VsZWN0Iik7cmV0dXJuIGErYn0sUGU6ZnVuY3Rpb24oYSxiLGMsZixlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYj10aGlzLkwuemEoYSksYyYmYi53bihjKSxmfHwoZj10aGlzLnlnKSxlfHwoZT10aGlzLnlnKSx0aGlzLnluKGEpLHRoaXMuTC5LYShiLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTsKZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5MaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0seW46ZnVuY3Rpb24oYSl7dGhpcy5kY1thXT0ib3BlbiJ9LExoOmZ1bmN0aW9uKGEpe3RoaXMuZGNbYV09ImNsb3NlZCJ9LG1wOmZ1bmN0aW9uKCl7dGhpcy5kYz17fX0sJHU6ZnVuY3Rpb24oKXt2YXIgYT0wLGI7Zm9yKGIgaW4gdGhpcy5kYyl0aGlzLmRjLmhhc093blByb3BlcnR5KGIpJiYib3BlbiI9PXRoaXMuZGNbYl0mJmErKztyZXR1cm4gYX0sZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSx2cDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxpdzpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUmJih0aGlzLnZpZGVvLnN0eWxlLmN1cnNvcj0icG9pbnRlciIsdGhpcy52aWRlby5vbmNsaWNrPXRoaXMua3cuYmluZCh0aGlzKSl9LGt3OmZ1bmN0aW9uKCl7ZS5WYSgpJiYKIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMuZmMoKTp0aGlzLmMuVWImJihlLncoay5yZyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0aGlzLkwuYWQmJihhPSJfYmxhbmsiKTt0cnl7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLmMuVWJ9Y2F0Y2goYyl7d2luZG93Lm9wZW4odGhpcy5jLlViLGEpfX0uYmluZCh0aGlzKSw1MDApKX0saHc6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMuWWMucmVwbGFjZSgiW3RpbWVdIixlLktnKDApKTt2YXIgYj10aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXTt0aGlzLkwuYmQmJihiPXRoaXMuTC5iZCk7YiYmd2luZG93LnNldFRpbWVvdXQodGhpcy5CYi5iaW5kKHRoaXMpLDFFMypiKTt0aGlzLmNhcHRpb249dGhpcy5yYS5hcHBlbmRDaGlsZChhKX19LEJiOmZ1bmN0aW9uKCl7KHRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdfHwKdGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxJZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5MLmJkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sb2k6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yy5pZD10aGlzLnJwO3RoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsiY29udHJvbHMuc3R5bGUiXTooYy5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGMuc3R5bGUud2lkdGg9IjEwMCUiLGMuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLGMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLApjLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixjLnN0eWxlLmJvdHRvbT0iMHB4IixjLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtjLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl0/Zi5zdHlsZT10aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdOihmLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpsZWZ0IiksZi5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGYuc3R5bGVbImZsb2F0Il09ImxlZnQiLGYuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zi5pZD10aGlzLkhiO2YuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbjsidnBhaWQiPT1hPyhmLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5laS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5kaS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmRpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmZjKCk7dGhpcy5JZCgpfS5iaW5kKHRoaXMpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQ2IoKTt0aGlzLkJiKCl9LmJpbmQodGhpcykpO3ZhciBnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsibXV0ZS5zdHlsZSJdP2cuc3R5bGU9dGhpcy5jb25mWyJtdXRlLnN0eWxlIl06KGcuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OnJpZ2h0IiksZy5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiLGcuc3R5bGVbImZsb2F0Il09InJpZ2h0IixnLnN0eWxlLmN1cnNvcj0KInBvaW50ZXIiKTtnLmlkPXRoaXMuRmI7Zy5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9nLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnd2LmJpbmQodGhpcykpOmcuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMudnYuYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSk7Zy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkNiKCk7dGhpcy5CYigpfS5iaW5kKHRoaXMpKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbInNraXAuc3R5bGUiXT9sLnN0eWxlPXRoaXMuY29uZlsic2tpcC5zdHlsZSJdOihsLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTUwcHg7cmlnaHQ6MHB4IiksbC5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGwuc3R5bGUudG9wPQoiLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0uNil9KTtsLmlubmVySFRNTD0iIjtjLmFwcGVuZENoaWxkKGYpO3RoaXMuYy5xZiYmYy5hcHBlbmRDaGlsZChsKTtjLmFwcGVuZENoaWxkKGcpO2Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZS5WYSgpfHwodGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5mYygpO3RoaXMuSWQoKX0uYmluZCh0aGlzKSksdGhpcy5yYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsCmZ1bmN0aW9uKCl7dGhpcy5DYigpO3RoaXMuQmIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYi5zdHlsZS53aWR0aD0iMTAwJSIsYi5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYi5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYi5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYi5zdHlsZS5ib3R0b209IjBweCIsYi5zdHlsZS56SW5kZXg9IjEwMDAwIixiLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW1nIiksYy5vbmVycm9yPWZ1bmN0aW9uKCl7dGhpcy55YSYmKHRoaXMueWEuc3R5bGUuYmFja2dyb3VuZD0idXJsKCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL2JpZ3BsYXkxOTA2MDYucG5nJykgbm8tcmVwZWF0IGNlbnRlciBjZW50ZXIiKX0uYmluZCh0aGlzKSwKYy5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApiLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnlhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYik7dGhpcy5iLmdnKGZ1bmN0aW9uKGEpe3RoaXMueWEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYi5nLnNhJiZ0aGlzLmIuZy5zYSgpJiYoZS53KGsuc2csdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSx0aGlzLlZlKCkpO3RoaXMuQ2IoKX19LENiOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZmM6ZnVuY3Rpb24oKXt0aGlzLnlhJiYiYmxvY2siPT10aGlzLnlhLnN0eWxlLmRpc3BsYXl8fHRoaXMuSWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGRpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5iLkYucGF1c2VkPyh0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLAp0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLncoay5XYyx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSl9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5IYik7dGhpcy5uYz8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJwbGF5IiksdGhpcy55YSYmKHRoaXMueWEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pLHRoaXMubmM9ITEpOihlLmxhKHRoaXMuSCwiY29udHJvbCIsCiJwYXVzZSIpLHRoaXMueWEmJih0aGlzLnlhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkNiKCksdGhpcy5CYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMubmM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGIpO3RoaXMuYi5GLnBhdXNlZHx8KHRoaXMuYi5GLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLncoay5mZSx0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sT2g6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkhiKTt0aGlzLmIuRi5wYXVzZWQmJih0aGlzLmIuRi5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsITApLGUudyhrLldjLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSwKdGhpcy5CKCkpKX0sdnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5tdXRlZD8odGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5MYigidW5tdXRlZCIsInVzZXIiKSxlLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKToodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJ1c2VyIiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LHd2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50Yj8oZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJ1bm11dGUiKSx0aGlzLnRiPSExLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLCJtdXRlIiksdGhpcy50Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxWZTpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLm11dGVkfHwodGhpcy5iLkYubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5MYigibXV0ZWQiLCJjb250ZW50IiksZS53KGsueWQsdGhpcy5jLkEsdGhpcy5iLmcudSgpLHRoaXMuQygpLHRoaXMuQigpKSl9LFF2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYubXV0ZWQmJih0aGlzLmIuRi5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkxiKCJ1bm11dGVkIiwiY29udGVudCIpLAplLncoay5BZix0aGlzLmMuQSx0aGlzLmIuZy51KCksdGhpcy5DKCksdGhpcy5CKCkpKX0sZWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5lYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuZWMpO3RoaXMuaGR8fHRoaXMuamV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLnNmKCkpfSx1ZTpmdW5jdGlvbigpe3ZhciBhPSExLGI9bC5nZXRDb25maWcoKTsic3ZtcHJldmlldyI9PWUueGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuYW5jaG9yJiYoYT0hMCxiLmFkRmFsbGJhY2tVUkx8fChiLmFkRmFsbGJhY2tVUkw9Imh0dHBzOi8vaGdjLWNmLWNhY2hlLTEuc3Zvbm0uY29tL3dlbGVjdC54bWwiKSk7dmFyIGM9ZS5sZCgpOyF0aGlzLkwubWN8fGUuVmEoKXx8IWMuaXNDaHJvbWUmJiFjLmlzRmlyZWZveHx8Yy5pc0VkZ2V8fAohKGF8fCF0aGlzLm9lJiZiLmFkRmFsbGJhY2tVUkwmJnRoaXMuTC5xYyl8fHRoaXMuQWg/KHRoaXMuaGQ9ITAsdGhpcy53YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy53YiksdGhpcy53Yj0hMSksdGhpcy50ZygpKToodGhpcy5BaD10aGlzLkpmPXRoaXMuSWY9ITAsZS50cmFjaygic3RhdHNfd3Rfc3RhcnQiLHRoaXMuWmEoKSwhMCksdGhpcy5vZT0hMCxhPWUuamcoYi5hZEZhbGxiYWNrVVJMLHRoaXMuTCwhMSx7b25seVVSTDohMH0pLHRoaXMuUWUoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KSl9LHRnOmZ1bmN0aW9uKGEpe3RoaXMuJHUoKSYmIWE/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRnKCEwKX0uYmluZCh0aGlzKSx0aGlzLkF0KToodGhpcy50Zj0hMCx0aGlzLmIuR2UoKSx0aGlzLmIubnUoKSx0aGlzLmFjPSExLGUudyhrLnFwLHRoaXMuYy5BLHRoaXMuYi5nLnUoKSx0aGlzLkMoKSx0aGlzLkIoKSksdGhpcy5DZSgpLk1oKCkpfSwKQ2U6ZnVuY3Rpb24oKXt2YXIgYT1udWxsO3RoaXMuYiYmdGhpcy5iLmcmJihhPXRoaXMuYi5nKTtyZXR1cm4gYX0sa2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhhKCJtaW5WaXMiKTthJiYoZS5LZSh0aGlzLnZpZGVvLGEpP3RoaXMuT2goKTp0aGlzLkJkKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmtnKCl9LmJpbmQodGhpcyksMTAwKSl9LEM6ZnVuY3Rpb24oKXt2YXIgYT17fTt0aGlzLmMmJihhLmNsaWNrdGhyb3VnaD10aGlzLmMuVWIsYS5kdXJhdGlvbj10aGlzLmMuZHVyYXRpb24sYS5hZFBvZD10aGlzLmMudmIsdGhpcy52aWRlbyYmdGhpcy52aWRlby5jdXJyZW50VGltZSYmKGEuY3VycmVudFRpbWU9dGhpcy52aWRlby5jdXJyZW50VGltZSksdGhpcy50YyYmMDx0aGlzLnRjLmxlbmd0aCYmKGEuYWRJZHM9dGhpcy50YykpO3RoaXMudmlkZW8mJnRoaXMudmlkZW8uZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPXRoaXMudmlkZW8uZHVyYXRpb24pO3JldHVybiBhfSwKQjpmdW5jdGlvbigpe3ZhciBhPXt9O2EuYWRzZXNzaW9uX2lkPXRoaXMuSW8rIi0iK3RoaXMucmY7dGhpcy5jJiZ0aGlzLmMuUWcmJihhLmhvbWFkSW1wcmVzc2lvbkFkSWQ9dGhpcy5jLlFnKCkpO3JldHVybiBhfSx5ZzpmdW5jdGlvbigpe319fSkodGhpcyk7dmFyIFJhPWMuaGt8fFJhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnFqPXRoaXMuYVs3XTt0aGlzLm5vPXRoaXMuYVs3XTt0aGlzLlR1PXRoaXMuYVs0XTt0aGlzLlRyPXRoaXMuYVs4XTt0aGlzLmp4PXRoaXMuYVs3XTt0aGlzLlJ1PXRoaXMuYVs0XTt0aGlzLkx0PXRoaXMuYVsxMF07dGhpcy56cD10aGlzLmFbNV07dGhpcy5kbj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbMl19Yy5PaT1iO2IucHJvdG90eXBlPXtwajpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucWo6dGhpcy5tbyhhKX0sbW86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5ubzp0aGlzLlN1KGEpfSxTdTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVHU6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlRyOnRoaXMuaXgoYSl9LGl4OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qeDp0aGlzLlF1KGEpfSxRdTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuUnU6dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkx0OnRoaXMueXAoYSl9LHlwOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy56cDp0aGlzLmNuKGEpfSxjbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZG46dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYT1jLk9pfHxTYSxGYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0KRmMucGooNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2g9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5FYT1udWxsO3RoaXMuWD1bXTt0aGlzLlU9bnVsbDt0aGlzLnNjPXRoaXMudWM9ITE7dGhpcy51YT0iIjt0aGlzLkdmPSExO3RoaXMuYWg9IiI7ZCYmZC5lbXB0eT90aGlzLkVzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUubGQoKSxiO2I9ZS54YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7YyYmKHRoaXMub3B0aW9ucy52cGFpZD0hMCk7Yj10aGlzLm9wdGlvbnMua2VlcFVSTD9uZXcgeih0aGlzLnVybCk6bC56YShsLk5kKHRoaXMudXJsKSwhMSwKdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlZhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLnZnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT1jfHwwPGRvY3VtZW50LmxvY2F0aW9uLmhyZWYuaW5kZXhPZigiZmFuZG9tLmNvbSIpJiYwPGEuaW5kZXhPZigicHViYWRzLmcuZG91YmxlY2xpY2submV0LyIpPwoodGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLk5kKGEpKSsiJnR5cGU9anMiLGI9bC56YShsLk5kKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnphKGwuTmQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLkthKGIsdGhpcy5Ecy5iaW5kKHRoaXMpLHRoaXMuQXMuYmluZCh0aGlzKSl9LE1nOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/CltdOltdLnNsaWNlLmNhbGwodGhpcy5FYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5FYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuJGIpdHJ5e3ZhciBkPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLkVhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJgooYj1bXS5zbGljZS5jYWxsKHRoaXMuRWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZCl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLiRifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS4kYnx8dGhpcy5ncyhhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5ldigpKXRyeXt2YXIgZj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49Zi5sZW5ndGgmJihmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLAoidGV4dC94bWwiKTtkW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxnczpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmCigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LERzOmZ1bmN0aW9uKGEpe3RoaXMuWHQoYSk7dHJ5e3RoaXMuRWE9YS5yZXNwb25zZVhNTCx0aGlzLkVhfHwodGhpcy5FYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuYWg9YS5qeTt0aGlzLlgubGVuZ3RoP3RoaXMuTGMoKTp0aGlzLnFhKHRoaXMuU2Eody5TYyx7ZXJyb3I6dGhpcy5HZj9GLmFlOkYuUGZ9KSl9LApFczpmdW5jdGlvbihhKXt0cnl7dGhpcy5FYXx8KHRoaXMuRWE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYSwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5xYSh0aGlzLlNhKHcuYmUpKX10aGlzLlg9dGhpcy5NZygpO3RoaXMudWM9dGhpcy53ZigpO3RoaXMuc2M9dGhpcy4kaCgpO3RoaXMuWC5sZW5ndGg/dGhpcy5MYygpOnRoaXMucWEodGhpcy5TYSh3LlNjLHtlcnJvcjp0aGlzLkdmP0YuYWU6Ri5QZn0pKX0sQXM6ZnVuY3Rpb24oKXt0aGlzLnFhKHRoaXMuU2Eody5PZix7ZGVwdGg6YX0pKX0sTGM6ZnVuY3Rpb24oKXt0aGlzLlU9dGhpcy5YLnNoaWZ0KCk7dGhpcy5qcygpP3RoaXMucHYoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5WZygpLGgse0FkU3lzdGVtOnRoaXMuTnEoKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlNhKHcuUmYpKTooYT0wLHRoaXMuV3YoKSYmdGhpcy5hZih0aGlzLnNwKCkpKX0sV2U6ZnVuY3Rpb24oKXt0aGlzLnVjPwoodGhpcy51Yz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5MYygpKTp0aGlzLnBhcmVudC5XZSgpfSx4aDpmdW5jdGlvbigpe3RoaXMuc2M/KHRoaXMuc2M9MTx0aGlzLlgubGVuZ3RoLHRoaXMuWC5sZW5ndGgmJnRoaXMuTGMoKSk6dGhpcy5wYXJlbnQueGgoKX0sV3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sdigpP3RoaXMua3YoKT8hMDooLTEhPXRoaXMuRmMoKT90aGlzLnFhKHRoaXMuU2Eody5YZCkpOnRoaXMucWEodGhpcy5TYSh3LktmKSksITEpOih0aGlzLnFhKHRoaXMuU2Eody5TYyxGLlFmKSksITEpfSxhZjpmdW5jdGlvbihhKXt0aGlzLnVhfHwodGhpcy51YT0iIik7YS5WZHx8KGEuVmQ9W10pO2EuVmQucHVzaCh0aGlzLmFoKTthLlBhPWEuUGEuY29uY2F0KHRoaXMuU2UoKSk7YS52Yj1hLnZiP2EudmI6dGhpcy51YzthLnJjPWEucmM/YS5yYzp0aGlzLnNjO2EuJGE9YS4kYT9hLiRhOi0xIT10aGlzLnVhLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmCiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5wYXJlbnQuYWYoYSl9LHNwOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFRhO3RoaXMudWF8fCh0aGlzLnVhPSIiKTthLmR1cmF0aW9uPXRoaXMuRmMoKTthLk89dGhpcy5TZygpO2EuVWI9dGhpcy5QcSgpO2EuZ3c9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5NcSgpO2EucWY9dGhpcy5jcihhLmR1cmF0aW9uKTthLiRhPWEuJGE/YS4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7cmV0dXJuIGF9LHFhOmZ1bmN0aW9uKGIpe3RoaXMudWF8fCh0aGlzLnVhPSIiKTtiLiRhPWIuJGE/Yi4kYTotMSE9dGhpcy51YS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuSWc7dGhpcy5VJiYoYi5QYT1iLmVycm9yLmNvZGUhPXcuWGQuY29kZT9iLlBhLmNvbmNhdCh0aGlzLlFxKCkpOmIuUGEuY29uY2F0KHRoaXMuWXEoKSkpO3RoaXMuWC5sZW5ndGg/KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5XYiYmCiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5XYiYmdGhpcy5wYXJlbnQuV2IoYiksYT0wLHRoaXMuTGMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5xYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LnFhJiZ0aGlzLnBhcmVudC5xYShiKSxhPTApfSxXYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5XYihhKX0sQWc6ZnVuY3Rpb24oYSxiKXt0aGlzLnFhKHRoaXMuU2EoYSxiKSl9LFNhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFVhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30scHY6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxsdjpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuU2coKS5sZW5ndGh9LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy5GYygpfSx3ZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJihiPTA8TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKSk7CnJldHVybiBifSkubGVuZ3RofSwkaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMud2YoKSYmKGE9ITApO3JldHVybiBhfSxYdDpmdW5jdGlvbihhKXt0aGlzLnVhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMudWE9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy51YT0iVU5LTk9XTiJ9dHJ5e3RoaXMuR2Y9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sanM6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlZnKCkubGVuZ3RofSxWZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LE5xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQmUodGhpcy5VLCJBZFN5c3RlbSIpfSxTZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0iSW1wcmVzc2lvbiBUcmFja2luZyBDbGlja1RyYWNraW5nIEVycm9yIFZpZXdhYmxlIE5vdFZpZXdhYmxlIHZpZXdhYmxlX2ltcHJlc3Npb24gbWVhc3VyYWJsZV9pbXByZXNzaW9uIi5zcGxpdCgiICIpLApiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5qaChhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5uYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LGpoOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuamgoYS5wYXJlbnROb2RlKTohMX0sWXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sUXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlNlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFBxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubmIodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDbGlja1Rocm91Z2giKVswXSl9LApTZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLFFhOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxKeDphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5uYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5RYXx8MUUzO3RyeXt2YXIgaD1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMSE9YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxlPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyhkLWEuUWEpLU1hdGguYWJzKGQtYi5RYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sTXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5xZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1kLnB1c2goYyk7ZS5wdXNoKGgpfTE8YS5sZW5ndGg/KGI9ZCxnPWgpOihiPWMsZz1lKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6Zy50b1N0cmluZygpfX0sRmM6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy5uYih0aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkR1cmF0aW9uIilbMF0pLAphPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxjcjpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLld1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0sQmU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD90aGlzLm5iKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYilbMF0pOiIifSxFZTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIn0sbmI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5xZChhKToiIn0scWQ6ZnVuY3Rpb24oYSl7dmFyIGI9CnRoaXMuRWUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnJ3PXRoaXMuYVs1XTt0aGlzLkprPXRoaXMuYVsxXTt0aGlzLkppPXRoaXMuYVs0XTt0aGlzLnhzPXRoaXMuYVs4XTt0aGlzLld0PXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzddfWMuUGw9YjtiLnByb3RvdHlwZT17cXc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJ3OnRoaXMuSWsoYSl9LElrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Kazp0aGlzLklpKGEpfSxJaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSmk6dGhpcy53cyhhKX0sd3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhzOnRoaXMuVnQoYSl9LFZ0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDwKYT90aGlzLld0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgVmE9Yy5QbHx8VmEsR2M9bmV3IFZhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9R2MucXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmR1cmF0aW9uPTA7dGhpcy5QYT1bXTt0aGlzLk89W107dGhpcy5VYj0iIjt0aGlzLkE9dGhpcy5yYz10aGlzLnZiPSExO3RoaXMuSGU9dGhpcy5vcmlnaW49bnVsbDt0aGlzLkllPSIifWMuTGw9YjtiLnByb3RvdHlwZT17bnA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT0hMDtyZXR1cm4gYX0sV3E6ZnVuY3Rpb24oKXtpZighdGhpcy5IZSYmdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkVhKXt2YXIgYT10aGlzLm9yaWdpbi5FYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksCmI9IiIsYz0wO2M8YS5sZW5ndGg7YysrKShiPWFbY10uZ2V0QXR0cmlidXRlKCJpZCIpKSYmMDw9Yi5pbmRleE9mKCJIT01BRCIpJiYodGhpcy5IZT1hW2NdKX1yZXR1cm4gdGhpcy5IZX0sUWc6ZnVuY3Rpb24oKXtpZih0aGlzLkllKXJldHVybiB0aGlzLkllO3ZhciBhPSIiOyhhPXRoaXMuV3EoKSkmJmEuZ2V0QXR0cmlidXRlPyhhPWEuZ2V0QXR0cmlidXRlKCJpZCIpLGE9YS5yZXBsYWNlKCJIT01BRF8iLCIiKSwoYT1hLnJlcGxhY2UoIkhPTUFEIiwiIikpfHwoYT0iZW1wdHkiKSk6YT0ibm9faW1wX25vZGUiO3JldHVybiB0aGlzLkllPWF9LGdyOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPSExLGI9MDtiPHRoaXMuTy5sZW5ndGg7YisrKWlmKDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8CjA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2VjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvanNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L3gtamF2YXNjcmlwdCIpKWE9dGhpcy5PW2JdO3JldHVybiBhfX19KShjKTt2YXIgVGE9Yy5MbHx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnY9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbN119Yy5MdT1iO2IucHJvdG90eXBlPXtNdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuTnY6dGhpcy5pKGEpfSwKaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5MdXx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMuTXYoNCk7dmFyIHc9e2JlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLE9hOiJYTUxfUEFSU0VfRVJST1IifSxLZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsT2E6IkRVUkFUSU9OX0VSUk9SIn0sU2M6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE9hOiJFTVBUWV9WQVNUIn0sClJmOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsbWVzc2FnZToiV3JhcHBlciBsaW1pdCByZWFjaGVkLCBhcyBkZWZpbmVkIGJ5IHRoZSB2aWRlbyBwbGF5ZXIuIFRvbyBtYW55IFdyYXBwZXIgcmVzcG9uc2VzIGhhdmUgYmVlbiByZWNlaXZlZCB3aXRoIG5vIEluTGluZSByZXNwb25zZS4iLE9hOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxPZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixPYToiTE9BRF9FUlJPUiJ9LApZZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLG1lc3NhZ2U6IkNvdWxkIG5vdCBmaW5kIE1lZGlhRmlsZSB0aGF0IGlzIHN1cHBvcnRlZCBieSB0aGlzIHZpZGVvIHBsYXllciwgYmFzZWQgb24gdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIE1lZGlhRmlsZSBlbGVtZW50LiIsT2E6Ik5PX1BMQVlBQkxFX1NPVVJDRVMifSxreDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixPYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsT2E6IkRVTU1ZX0FEIn19LEY9e1BmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsT2E6Ik5PX0FEUyJ9LFFmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixPYToiTk9fTUVESUFGSUxFUyJ9LGx4Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLApPYToiTk9fUExBWUFCTEVfTUVESUFGSUxFUyJ9LGFlOnt0eXBlOiJlcnJvciIsY29kZTozMDM0LG1lc3NhZ2U6InZwYWlkIGlnbm9yZWQiLE9hOiJWUEFJRF9JR05PUkVEIn19O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnVvPXRoaXMuYVs2XTt0aGlzLndvPXRoaXMuYVs5XTt0aGlzLmpxPXRoaXMuYVs1XTt0aGlzLmFsPXRoaXMuYVsxXTt0aGlzLmFtPXRoaXMuYVs0XTt0aGlzLlZ1PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzldfWMuJG09YjtiLnByb3RvdHlwZT17dG86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnVvOnRoaXMudm8oYSl9LHZvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMud286dGhpcy5pcShhKX0saXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpxOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5hbDp0aGlzLiRsKGEpfSwKJGw6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmFtOnRoaXMuVXUoYSl9LFV1OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5WdTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLiRtfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy50byg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuZXJyb3I9YTt0aGlzLmtkPWI7dGhpcy5QYT1bXTt0aGlzLm9yaWdpbj1udWxsfWMuUGo9YjtiLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLlBqfHxVYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5meD10aGlzLmFbMTBdO3RoaXMuRHA9dGhpcy5hWzEwXTsKdGhpcy5XcD10aGlzLmFbNl07dGhpcy51aj10aGlzLmFbOV07dGhpcy5mbD10aGlzLmFbOF07dGhpcy5Ocj10aGlzLmFbN107dGhpcy5YaT10aGlzLmFbMl07dGhpcy5wbT10aGlzLmFbNF07dGhpcy5qPXRoaXMuYVs0XX1jLkh0PWI7Yi5wcm90b3R5cGU9e2V4OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5meDp0aGlzLkNwKGEpfSxDcDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuRHA6dGhpcy5WcChhKX0sVnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldwOnRoaXMudGooYSl9LHRqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy51ajp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZmw6dGhpcy5NcihhKX0sTXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLk5yOnRoaXMuV2koYSl9LFdpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YaTp0aGlzLm9tKGEpfSxvbTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucG06CnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuajphfX19KShjKTt2YXIgWWE9Yy5IdHx8WWEsSmM9bmV3IFlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SmMuZXgoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLk5oPWE7dGhpcy52aWRlbz1iO3RoaXMuU2Q9W107dGhpcy5LaD1bXTt0aGlzLlhlPVtdO3RoaXMubHc9ImxvYWRlZCBzdGFydCBmaXJzdFF1YXJ0aWxlIG1pZHBvaW50IHRoaXJkUXVhcnRpbGUgY29tcGxldGUgcGF1c2UgcmVzdW1lIGJ1ZmZlclN0YXJ0IGJ1ZmZlckZpbmlzaCBza2lwcGVkIHZvbHVtZUNoYW5nZSBwbGF5ZXJTdGF0ZUNoYW5nZSBhZFVzZXJJbnRlcmFjdGlvbiIuc3BsaXQoIiAiKTt0aGlzLk0oKX1jLlprPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuTmgubGVuZ3RoO2ErKyl7dmFyIGI9CnRoaXMuTmhbYV0sYz1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJKYXZhU2NyaXB0UmVzb3VyY2UiKVswXS50ZXh0Q29udGVudCxmPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIlZlcmlmaWNhdGlvblBhcmFtZXRlcnMiKVswXS50ZXh0Q29udGVudCxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKTt2YXIgZz1lLmNvbnRlbnRXaW5kb3c7Zy5keT17cmVnaXN0ZXJTZXNzaW9uT2JzZXJ2ZXI6dGhpcy5rdS5iaW5kKHRoaXMpLGFkZEV2ZW50TGlzdGVuZXI6dGhpcy5idS5iaW5kKHRoaXMpfTt2YXIgaz1nLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2suc3JjPSJodHRwczovL2Rldi5zY2huZWV2b25tb3JnZW4uY29tL3ZpbmNlbnQvc2FuZGJveC9zYW5kYm94X3NhLmpzIjtrLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CmEuc3JjPWM7Zy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpfS5iaW5kKHRoaXMpO2cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrKTt0aGlzLlNkLnB1c2goe3NyYzpjLGZyYW1lOmUsQnQ6Zix2ZW5kb3I6Yi5nZXRBdHRyaWJ1dGUoInZlbmRvciIpfSl9fSx0cmFjazpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuWGUubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5YZVtiXTtjLnR5cGU9PT1hJiZjLlRvKHRoaXMuUnEoYSkpfX0sUnE6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgImxvYWRlZCI6cmV0dXJue3R5cGU6ImxvYWRlZCIsZGF0YTp7bnk6ITAsbXk6NSxhdXRvcGxheTohMSxwb3NpdGlvbjoic3RhbmRhbG9uZSJ9fTtjYXNlICJpbXByZXNzaW9uIjpyZXR1cm57dHlwZToiaW1wcmVzc2lvbiIsZGF0YTp7JHg6InZpZGVvIixweToianNDdXN0b20iLHF5OiIxLjAuMC1kZXYifX07Y2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsCnJ5OjEsS3g6MH19O2RlZmF1bHQ6cmV0dXJue3R5cGU6YSxkYXRhOnt9fX19LGdldENvbnRleHQ6ZnVuY3Rpb24oKXtyZXR1cm57YXBpVmVyc2lvbjoiMS4wIixlbnZpcm9ubWVudDoid2ViIixhY2Nlc3NNb2RlOiJmdWxsIix2aWRlb0VsZW1lbnQ6dGhpcy52aWRlbyxhZFNlc3Npb25UeXBlOiJodG1sIixhZFNlcnZpbmdJZDoidW5kZWZpbmVkIixvbWlkSnNJbmZvOntvbWlkSW1wbGVtZW50ZXI6ImhvbWFkIixzZXJ2aWNlVmVyc2lvbjoiMS4wLjAtZGV2In19fSxmcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9MDtiPHRoaXMuU2QubGVuZ3RoO2IrKylpZih0aGlzLlNkW2JdLnZlbmRvcj09PWEpcmV0dXJuIHRoaXMuU2RbYl0uQnQ7cmV0dXJuIiJ9LGt1OmZ1bmN0aW9uKGEsYil7dGhpcy5LaC5wdXNoKHtvYnNlcnZlcjphLHZlcmlmaWNhdGlvblBhcmFtZXRlcnM6dGhpcy5mcihiKSx2ZW5kb3I6Yn0pO3RoaXMuWXUoKX0sYnU6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLmx3Lm1hcChmdW5jdGlvbihhKXt0aGlzLmhnKGEsCmIpfS5iaW5kKHRoaXMpKTp0aGlzLmhnKGEsYil9LGhnOmZ1bmN0aW9uKGEsYil7dGhpcy5YZS5wdXNoKHt0eXBlOmEsVG86YixreTohMX0pfSxZdTpmdW5jdGlvbigpe3RoaXMuS2gubWFwKGZ1bmN0aW9uKGEpe2EuZXN8fChhLmN5KHthZFNlc3Npb25JZDplLmFhKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5veSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLGEuZXM9ITApfS5iaW5kKHRoaXMpKX19fSkoYyk7dmFyIFFhPWMuWmt8fFFhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlNtPXRoaXMuYVsxMF07dGhpcy5Vdz10aGlzLmFbMV07dGhpcy5wbz10aGlzLmFbOF07dGhpcy5ZbT10aGlzLmFbMl07dGhpcy5vdD10aGlzLmFbOV07dGhpcy5ObT10aGlzLmFbMl07dGhpcy5abj10aGlzLmFbOV07CnRoaXMuSGs9dGhpcy5hWzNdO3RoaXMuR249dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5ocD1iO2IucHJvdG90eXBlPXtSbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuU206dGhpcy5UdyhhKX0sVHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlV3OnRoaXMub28oYSl9LG9vOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5wbzp0aGlzLlhtKGEpfSxYbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuWW06dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm90OnRoaXMuTW0oYSl9LE1tOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5ObTp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuWm46dGhpcy5HayhhKX0sR2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkhrOnRoaXMuRm4oYSl9LEZuOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Hbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8CmE/dGhpcy5qOmF9fX0pKGMpO3ZhciBaYT1jLmhwfHxaYSxLYz1uZXcgWmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1LYy5SbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmc9YTt0aGlzLmtiPWEuTmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksdGhpcy5GLmlkPSJhZFhkaXNwbGF5Iix0aGlzLkYuc3R5bGUuZGlzcGxheT0iYmxvY2siKTt0aGlzLkQ9e307dGhpcy5pZz0hMTt0aGlzLlRiPVtdfWMuemo9YjtiLnByb3RvdHlwZT17SHE6ZnVuY3Rpb24oYSl7dmFyIGI9Cnt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuSHEoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLnVyKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDoKKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxjdjpmdW5jdGlvbigpe3RoaXMuaWc9ITB9LGxpOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxEaDpmdW5jdGlvbigpe3RoaXMuZy5wYXVzZSgpO2UudyhrLmZkLHRoaXMuZy51KCkpfSxudTpmdW5jdGlvbigpe3RoaXMuaWd8fCh0aGlzLmcucGxheSgpLGUudyhrLmdkLHRoaXMuZy51KCkpKX0scGY6ZnVuY3Rpb24oKXt2YXIgYT0KMjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmcucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmtiLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMua2Iub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9dGhpcy5rYi5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5rYik7dGhpcy5nLk5jJiZ0aGlzLmcuTmMoKT90aGlzLmcuTmcoKS5hcHBlbmRDaGlsZCh0aGlzLkspOgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5aYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmcuZXhpdEZ1bGxzY3JlZW4oKX0sdXI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LHdxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy53cSh0aGlzLmtiKTsKaWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5HZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmcuTmMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO3RoaXMuSy5zdHlsZS5wb3NpdGlvbj1iLnBvc2l0aW9uO3RoaXMuRi5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5GLnN0eWxlLmhlaWdodD1iLmhlaWdodCsicHgiO2ZvcihhPTA7YTx0aGlzLlRiLmxlbmd0aDthKyspdGhpcy5UYlthXSh7d2lkdGg6Yi53aWR0aCwKaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5XaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLlpiLmJpbmQodGhpcyksMTApfSxnZzpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy5UYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuVGIucHVzaChhKX0sR2U6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgJGE9Yy56anx8JGEsQz1bXSxhYj0wOzEwMD5hYjthYisrKXt2YXIgTj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO04uc3R5bGUuZGlzcGxheT0iYmxvY2siO04uaWQ9ZS5hYSgxMCk7Ti5jb250cm9scz0hMDtDLnB1c2goTil9dmFyIEs9ITEsY2E9ITE7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWXA9dGhpcy5hWzJdO3RoaXMuWXc9dGhpcy5hWzZdO3RoaXMuSnE9dGhpcy5hWzRdO3RoaXMuR3Q9dGhpcy5hWzEwXTt0aGlzLkZvPXRoaXMuYVs0XTt0aGlzLkhwPXRoaXMuYVs1XTt0aGlzLlB3PXRoaXMuYVs5XTt0aGlzLlV0PXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzJdfWMudHQ9YjtiLnByb3RvdHlwZT17WHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5ZcDp0aGlzLlh3KGEpfSxYdzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLll3OnRoaXMuSXEoYSl9LElxOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5KcTp0aGlzLkZ0KGEpfSxGdDpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLkd0OnRoaXMuRW8oYSl9LEVvOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Gbzp0aGlzLkdwKGEpfSxHcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHA6dGhpcy5PdyhhKX0sT3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlB3OnRoaXMuVHQoYSl9LFR0OmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuVXQ6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBiYj1jLnR0fHxiYixMYz1uZXcgYmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1MYy5YcCg0KTsoZnVuY3Rpb24oYyl7Yy52bD10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpOwphfHwoYj10aGlzLmdldFJhd1BsYXllcigpLmdldEVsZW1lbnRJZCgpLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYikpO3RoaXMuVihhKTt0aGlzLkhkKGIpO3RoaXMud2coKX0sSGQ6ZnVuY3Rpb24oYil7dGhpcy5pZHx8KHRoaXMuaWQ9Yil9LHdnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYSgpLGE9dGhpcy52aWRlb1RhZzthfHwoKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxhP3RoaXMuWihhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMud2coKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sTGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJgpiLmlzUGxheWluZygpJiZ0aGlzLnBhdXNlKCl9LEplOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wYXJhbWV0ZXJzJiYhMT09PWIucGFyYW1ldGVycy5hdXRvcGxheT8hMTohMH0sUDpmdW5jdGlvbigpe3JldHVybiJPb3lhbGEifSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sdTpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxjPXRoaXMuSWEoKTtpZihiLnZpZGVvVGFnPWEpYi52aWRlb1RhZ0lkPWEuaWQ7aWYoYi5jb250YWluZXI9YyliLmNvbnRhaW5lcklkPWMuaWQ7Yi5wbGF5ZXI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYn19KX0pKGMpO3ZhciBjYj1jLnZsfHxjYjsoZnVuY3Rpb24oYyl7Yy51bD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9ZGEoKTt0aGlzLlNiPXRoaXMuU2J8fCExO3RoaXMuJGY9dGhpcy5iZz0KdGhpcy5maD10aGlzLmVhPXRoaXMuemY9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy50cShhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuemY9ITA7dGhpcy5maCYmdGhpcy5xZygpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLkRiO2EmJmEuYWMmJnRoaXMuZ2V0UGxheWVyKCkucGF1c2UoKX0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5JTklUSUFMX1BMQVksImV4YW1wbGUiLGZ1bmN0aW9uKCl7dGhpcy5kZCgpO3RoaXMuZmg9ITA7dGhpcy5xZygpfS5iaW5kKHRoaXMpKTsKdGhpcy5tZygpfSxxZzpmdW5jdGlvbigpe2lmKCF0aGlzLlNiKXt0aGlzLmRkKCk7aWYoIXRoaXMuemYmJiF0aGlzLmRkKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy56ZiYmdGhpcy4kZiYmIXRoaXMuYmcmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSxkZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVGcoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sVGc6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYz0wO2M8YS5tb2R1bGVzLmxlbmd0aDtjKyspe3ZhciBkPWEubW9kdWxlc1tjXTtpZihkLm5hbWU9PT1iKXJldHVybiBkLmluc3RhbmNlfX0sbWc6ZnVuY3Rpb24oKXtpZih0aGlzLmRkKCkpe3ZhciBiPQp0aGlzLlRnKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuYmc9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy4kZj1iLkh4fXRoaXMud2EoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKX0sTHg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IuWXgoKTohMX0sRmM6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj9iLkZjKCk6LTF9LFpxOmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGIuaXNQbGF5aW5nP2IuaXNQbGF5aW5nKCk6LTF9LHRxOmZ1bmN0aW9uKGIsYSl7dGhpcy5TYj1hLm1hdGNoKC9cZCsvKT9wYXJzZUludChhLm1hdGNoKC9cZCsvKVswXSk6MDsxMDA5PT0KdGhpcy5TYnx8MzAyPT10aGlzLlNiP3RoaXMuZWE9ITA6dGhpcy5zKCJhZGVycm9yIix0aGlzLlNiKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWQoKX0uYmluZCh0aGlzKSwxMDApfSxlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT8odGhpcy52KCksdGhpcy5wYSgpKTpiLkplKCk/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuWnEoYik/KHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDJFMykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lZCgpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZGI9Yy51bHx8ZGI7KGZ1bmN0aW9uKGMpe2Mud2w9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmczpmdW5jdGlvbigpe3dpbmRvdy5PTy5RbC5qbi5nbj93aW5kb3cuT08uUWwuam4uZ24uRngoZnVuY3Rpb24oKXt9KToKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZzKCl9LDEwMCl9LGY6ZnVuY3Rpb24oKXt0aGlzLldhPTE1MDA7dmFyIGI9ZGEoKTtpZihiJiZiLl9faW50ZXJuYWwmJmIuX19pbnRlcm5hbC5wbGF5ZXJzJiYwPGUuRGUoYi5fX2ludGVybmFsLnBsYXllcnMpKWZvcih2YXIgYSBpbiBiLl9faW50ZXJuYWwucGxheWVycylpZihiLl9faW50ZXJuYWwucGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9bmV3IGNiKGIuX19pbnRlcm5hbC5wbGF5ZXJzW2FdKTt0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBkYihjLHRoaXMuSSkpLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgZWI9Yy53bHx8ZWIsZmI9bmV3IGViKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnZzPXRoaXMuYVs3XTt0aGlzLm5tPXRoaXMuYVs3XTt0aGlzLmZ3PXRoaXMuYVsxXTt0aGlzLkh2PQp0aGlzLmFbNl07dGhpcy5IaT10aGlzLmFbMTBdO3RoaXMueXE9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19Yy5Mbz1iO2IucHJvdG90eXBlPXt1czpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnM6dGhpcy5tbShhKX0sbW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLm5tOnRoaXMuZXcoYSl9LGV3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5mdzp0aGlzLkd2KGEpfSxHdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSHY6dGhpcy5HaShhKX0sR2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5IaTp0aGlzLnhxKGEpfSx4cTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMueXE6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBnYj1jLkxvfHxnYixNYz1uZXcgZ2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsKd2luZG93LkQ9TWMudXMoNCk7KGZ1bmN0aW9uKGMpe2Mua2o9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5tYT0hMTt0aGlzLldnKCl9LFdnOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTtifHwoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTtiJiYhYSYmKGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YiYmYT8odGhpcy5WKGIpLHRoaXMuWihhKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLldnKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sTmE6ZnVuY3Rpb24oKXt0aGlzLkdoKCl9LEdoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWI/dGhpcy5XJiYoMCx0aGlzLlcpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkdoKCl9LmJpbmQodGhpcyksMTAwKX0sUDpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgaGI9Yy5ranx8aGI7KGZ1bmN0aW9uKGMpe2Muamo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sbmc6ZnVuY3Rpb24oYil7dmFyIGE9CmIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOzEyMDUhPWEmJig5MDA9PWEmJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudigiZW1wdHkiKSx0aGlzLnBhKCkpOjEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyhlLnRhKCJ3ZWx0LmRlIikmJmUua3EoKSx0aGlzLnBhKCkpOnRoaXMubSgpKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZEVycm9yRXZlbnRzKWZvcih2YXIgYT0wO2E8Yi5hZEVycm9yRXZlbnRzLmxlbmd0aDthKyspdGhpcy5uZyhiLmFkRXJyb3JFdmVudHMpO2IucGxheWVyLm9uKCJhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLm5nKGEpfS5iaW5kKHRoaXMpKTtiLnBsYXllci5vbigiYWRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoImFkcXVhcnRpbGUiKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnBsYXllci5pc1BsYXlpbmcoKT8KdGhpcy5HKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgaWI9Yy5qanx8aWI7KGZ1bmN0aW9uKGMpe2MubGo9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxKaDpmdW5jdGlvbihiKXtiPW5ldyBoYihiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KGIuSGQoTWF0aC5jZWlsKDFFMTAqTWF0aC5yYW5kb20oKSkpLHRoaXMuUihiKSwobmV3IGliKGIsdGhpcy5JKSkuZigpKX0sZjpmdW5jdGlvbigpe3RoaXMudXF8fCh0aGlzLnVxPSEwLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInN2bTpwbGF5ZXJpbnN0YW5jZSIsZnVuY3Rpb24oYSl7dGhpcy5KaChhLmRldGFpbCl9LmJpbmQodGhpcykpKTtpZih3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4mJndpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlcy5sZW5ndGg7YisrKXRoaXMuSmgod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzW2JdKTsKdGhpcy5UKCl9fSl9KShjKTt2YXIgamI9Yy5sanx8amIsVD1uZXcgamIocik7VC5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTnQ9dGhpcy5hWzNdO3RoaXMuT3A9dGhpcy5hWzFdO3RoaXMuS3A9dGhpcy5hWzFdO3RoaXMucHI9dGhpcy5hWzRdO3RoaXMuaW89dGhpcy5hWzNdO3RoaXMucnI9dGhpcy5hWzFdO3RoaXMuVWo9dGhpcy5hWzldO3RoaXMuTHI9dGhpcy5hWzhdO3RoaXMuaj10aGlzLmFbNl19Yy5Baz1iO2IucHJvdG90eXBlPXtNdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTnQ6dGhpcy5OcChhKX0sTnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLk9wOnRoaXMuSnAoYSl9LEpwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5LcDp0aGlzLm9yKGEpfSxvcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMucHI6dGhpcy5obyhhKX0saG86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8CmE/dGhpcy5pbzp0aGlzLnFyKGEpfSxxcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMucnI6dGhpcy5UaihhKX0sVGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlVqOnRoaXMuS3IoYSl9LEtyOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Mcjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGtiPWMuQWt8fGtiLE5jPW5ldyBrYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU5jLk10KDQpOyhmdW5jdGlvbihjKXtjLmptPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVihiKTtpZihiKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5NLmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGIpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChiKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LE5jOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFU9Yy5qbXx8VTsoZnVuY3Rpb24oYyl7Yy5pbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5YYygiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMudi5iaW5kKHRoaXMpLDIwMCl9LmJpbmQodGhpcykpO3kuWGMoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5acyhhKX0uYmluZCh0aGlzKSk7eS5YYygiIyIrYiwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRygpfS5iaW5kKHRoaXMpKTt5LlhjKCIjIitiLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMucygiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5rcigpfSxaczpmdW5jdGlvbihiKXt2YXIgYT0iIixjO2ZvcihjIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShjKSl7YT1pc05hTihiW2NdKT8hMTpiW2NdO2lmKDEwMDk9PWJbY118fDEwMDE9PWJbY118fAozMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy52KCk7dGhpcy5wYSgpO3JldHVybn19dGhpcy5zKCJhZGVycm9yIixhKTt0aGlzLkcoKX19KX0pKGMpO3ZhciBWPWMuaW18fFY7KGZ1bmN0aW9uKGMpe2Mua209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGI9W10sYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pOwp0aGlzLnpkJiYoYj1lLndwKGIsdGhpcy56ZCkpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBkPWJbYV0uaWQucmVwbGFjZSgiY29udGVudEVsZW1lbnQiLCIiKSxkPW5ldyBVKGQpO2lmKCF0aGlzLk4oZCkpe3RoaXMuUihkKTt2YXIgZj1uZXcgVihkLHRoaXMuSSk7Zi5mKCl9fWZvcihhPTA7YTxiLmxlbmd0aDthKyspZm9yKGM9YlthXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsZz1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihnKXRyeXt0Zm1zdWl0ZSgiIyIrZykudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuemR8fCh0aGlzLnpkPVtdKSx0aGlzLnpkLnB1c2goYlthXSksZD1uZXcgVShnKSx0aGlzLk4oZCl8fCh0aGlzLlIoZCksZj1uZXcgVihkLHRoaXMuSSksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuVCgpfSxYYzpmdW5jdGlvbihiLGEsYyl7dGhpcy5kYXx8KHRoaXMuZGE9e30pO3RoaXMuZGFbYl18fCh0aGlzLmRhW2JdPXt9KTt0aGlzLmRhW2JdW2FdfHwKKHRoaXMuZGFbYl1bYV09W10pO3RoaXMuZGFbYl1bYV0ucHVzaChjKX0scXY6ZnVuY3Rpb24oYil7dmFyIGE9Yi5zUGxheWVyU2VsZWN0b3I7aWYoYilpZighdGhpcy5kYXx8dGhpcy5kYSYmIXRoaXMuZGFbYV0pdGhpcy5LY3x8KHRoaXMuS2M9W10pLHRoaXMuS2MucHVzaChiKSx0aGlzLm11KCkmJih0aGlzLmhmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoYz1iLm9FdmVudFR5cGUpO2lmKHRoaXMuZGFbYV1bY10mJjA8dGhpcy5kYVthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmRhW2FdW2NdLmxlbmd0aDtkKyspdGhpcy5kYVthXVtjXVtkXShiKX19LGtyOmZ1bmN0aW9uKCl7aWYodGhpcy5LYylmb3IodmFyIGI9MDtiPHRoaXMuS2MubGVuZ3RoO2IrKyl7dmFyIGE9dGhpcy5LY1tiXSxjPWEuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoZD0KYS5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2NdW2RdJiYwPHRoaXMuZGFbY11bZF0ubGVuZ3RoKWZvcih2YXIgZj0wO2Y8dGhpcy5kYVtjXVtkXS5sZW5ndGg7ZisrKXRoaXMuZGFbY11bZF1bZl0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF2KGIpfX0pfSkoYyk7dmFyIGxiPWMua218fGxiLHk9bmV3IGxiKHIpO2JhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRW49dGhpcy5hWzNdO3RoaXMuSGo9dGhpcy5hWzhdO3RoaXMuY2o9dGhpcy5hWzVdO3RoaXMuTWo9dGhpcy5hWzVdO3RoaXMuc3Y9dGhpcy5hWzddO3RoaXMuVXM9dGhpcy5hWzEwXTt0aGlzLmxzPXRoaXMuYVsyXTt0aGlzLkxpPXRoaXMuYVsyXTsKdGhpcy5qPXRoaXMuYVs4XX1jLklwPWI7Yi5wcm90b3R5cGU9e0RuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Fbjp0aGlzLkdqKGEpfSxHajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuSGo6dGhpcy5iaihhKX0sYmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmNqOnRoaXMuTGooYSl9LExqOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTWo6dGhpcy5ydihhKX0scnY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLnN2OnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Vczp0aGlzLmtzKGEpfSxrczpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMubHM6dGhpcy5LaShhKX0sS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLkxpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWI9Yy5JcHx8bWIsT2M9bmV3IG1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPU9jLkRuKDQpOyhmdW5jdGlvbihjKXtjLmdqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubXV0ZWQ9ITE7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYil7Yi5wbGF5KCl9KX0sTGE6ZnVuY3Rpb24oKXskKCIjIisKdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IuaXNQbGF5aW5nKCkmJmIucGF1c2UoKX0pfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm11dGVkfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkJpbGRNZWRpYVBsYXllciJ9fSl9KShjKTt2YXIgbmI9Yy5nanx8bmI7KGZ1bmN0aW9uKGMpe2MuaGo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYikuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiYKYS5pc0FkKCk/dGhpcy52KCk6YS5kYXRhJiZhLmRhdGEuYWRzJiZhLmRhdGEuYWRzLnZhc3QmJmEuZGF0YS5hZHMudmFzdC5zcmNlcz8odGhpcy5zKCJub0FkIiwicGxheWVkIiksdGhpcy5HKCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zKCJub0FkIiwicGxheWVkIik7dGhpcy5HKCEwKX0uYmluZCh0aGlzKSwyNTApfS5iaW5kKHRoaXMpKTthLm9uKCJwYXVzZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIndhaXRpbmciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTsKYS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb01pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvVGhpcmRRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIG9iPWMuaGp8fG9iOyhmdW5jdGlvbihjKXtjLmlqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGM9CmJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChmKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGU9bmV3IG5iKGQpO3RoaXMuTihlKXx8KHRoaXMuUihlKSwobmV3IG9iKGUsdGhpcy5JKSkuZigpKX1jYXRjaChnKXt9fXRoaXMuVCgpfSxOOmZ1bmN0aW9uKGIpe3ZhciBhPWIuZ2V0UmF3UGxheWVyKCk7JCgiIyIrYSk7Zm9yKHZhciBjIGluIHRoaXMuTWEpaWYoYT09dGhpcy5NYVtjXS5nZXRSYXdQbGF5ZXIoKSlyZXR1cm4hMDtyZXR1cm4gdGhpcy5NYVtiLmthKCldPyEwOiExfX0pfSkoYyk7dmFyIHBiPWMuaWp8fHBiLHFiPW5ldyBwYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jbD10aGlzLmFbNF07dGhpcy5tdD10aGlzLmFbNF07dGhpcy5Jdz10aGlzLmFbNl07dGhpcy56dD10aGlzLmFbMl07dGhpcy5Ibz0KdGhpcy5hWzNdO3RoaXMuS249dGhpcy5hWzFdO3RoaXMuZG09dGhpcy5hWzVdO3RoaXMuZXQ9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5abT1iO2IucHJvdG90eXBlPXtibDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuY2w6dGhpcy5sdChhKX0sbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm10OnRoaXMuSHcoYSl9LEh3OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Jdzp0aGlzLnl0KGEpfSx5dDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnp0OnRoaXMuR28oYSl9LEdvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ibzp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuS246dGhpcy5jbShhKX0sY206ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmRtOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ldDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOgphfX19KShjKTt2YXIgcmI9Yy5abXx8cmIsUGM9bmV3IHJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UGMuYmwoNCk7KGZ1bmN0aW9uKGMpe2MucWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT0hMTt0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMmJnRoaXMuZ2V0UmF3UGxheWVyKCkuZW52dmFycygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTtiJiYoYT1iKTt0aGlzLlYoYik7dGhpcy5aKGEpO3RoaXMuYXUodGhpcy5nZXRSYXdQbGF5ZXIoKSxiKTt0aGlzLmdldFJhd1BsYXllcigpfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sYXU6ZnVuY3Rpb24oYiwKYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucGF1c2UmJnRoaXMuaWEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiZ0aGlzLmlhLnJlc3VtZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaWEucmVzdW1lJiZ0aGlzLmlhLnJlc3VtZSgpfS5iaW5kKHRoaXMpKTtiJiZiLm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5pYSYmdGhpcy5pYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5pYS5tdXRlJiZ0aGlzLmlhLm11dGUoKX0uYmluZCh0aGlzKSk7YiYmYi51bm11dGVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmlhJiYKdGhpcy5pYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmlhLnVubXV0ZSYmdGhpcy5pYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LGdoOmZ1bmN0aW9uKGIpe3RoaXMuaWE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHNiPWMucWx8fHNiOyhmdW5jdGlvbihjKXtjLnBsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy52aT0hMX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT10aGlzLmdldFBsYXllcigpO2IuYXV0b3N0YXJ0JiYhdGhpcy52aSYmKHRoaXMuRygpLHRoaXMudmk9ITAsdGhpcy5uYSgpKTthLklhKCkuYWRkRXZlbnRMaXN0ZW5lcihiLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuRygpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciB0Yj1jLnBsfHx0YjsoZnVuY3Rpb24oYyl7Yy5ybD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LApmOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyBzYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyB0YihjLHRoaXMuSSkpLmYoKSl9fWVsc2UgdGhpcy5UKCl9fSl9KShjKTt2YXIgdWI9Yy5ybHx8dWIsVz1uZXcgdWIocik7Vy5mKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYm49dGhpcy5hWzEwXTt0aGlzLkRxPXRoaXMuYVs3XTt0aGlzLnJrPXRoaXMuYVs4XTt0aGlzLlRuPXRoaXMuYVszXTt0aGlzLkx3PXRoaXMuYVs1XTt0aGlzLm1uPXRoaXMuYVs0XTt0aGlzLmd0PXRoaXMuYVs1XTt0aGlzLmpyPXRoaXMuYVs4XTsKdGhpcy5qPXRoaXMuYVszXX1jLlZzPWI7Yi5wcm90b3R5cGU9e2FuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5ibjp0aGlzLkNxKGEpfSxDcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRHE6dGhpcy5xayhhKX0scWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5yazp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG46dGhpcy5LdyhhKX0sS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkx3OnRoaXMubG4oYSl9LGxuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5tbjp0aGlzLmZ0KGEpfSxmdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZ3Q6dGhpcy5pcihhKX0saXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmpyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgdmI9Yy5Wc3x8dmIsUWM9bmV3IHZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIiwKbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLmFuKDQpOyhmdW5jdGlvbihjKXtjLkttPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlYoYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuWihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGI/Yi5tdXRlZDohMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jdXJyZW50VGltZX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LE5hOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5XPygwLHRoaXMuVykoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSw0MDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHdiPWMuS218fHdiOyhmdW5jdGlvbihjKXtjLkptPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFhiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKSxiPWIuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuaW1hQWRzTG9hZGVyfSxadDpmdW5jdGlvbihiKXtiLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiwKZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMucGEoKTp0aGlzLnMoImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy52Yz0hMDt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMubSgpO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5BYT90aGlzLlp0KHRoaXMuQWEpOih0aGlzLkFhPXRoaXMuWGIoKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSwxMDApKX0sbTpmdW5jdGlvbigpe3ZhciBiPQp0aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nJiYxPGIuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQWEpe3RoaXMuRygpO3JldHVybn1pZighdGhpcy52Yyl7dGhpcy5HKCk7cmV0dXJufWI9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLmViLmxlbmd0aC0xO2ErKykxMDA5IT10aGlzLmViW2FdJiYzMDMhPXRoaXMuZWJbYV0mJjQwMyE9dGhpcy5lYlthXSYmKGI9ITEpO2lmKGIpdGhpcy52KCJlbXB0eSIpLHRoaXMucGEoKTtlbHNle3RoaXMuRygpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHhiPWMuSm18fHhiOyhmdW5jdGlvbihjKXtjLkxtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe3RoaXMuV2E9LTE7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7CmlmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IHdiKGIuaXRlbShhKSk7dGhpcy5OKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5SKGMpLChuZXcgeGIoYyx0aGlzLkkpKS5mKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIHliPWMuTG18fHliLHpiPW5ldyB5YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5hdD10aGlzLmFbOV07dGhpcy5Sdz10aGlzLmFbNl07dGhpcy5mbT10aGlzLmFbMV07dGhpcy55aj10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbMV07dGhpcy5qPXRoaXMuYVs1XX1jLmxtPWI7Yi5wcm90b3R5cGU9eyRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdDp0aGlzLlF3KGEpfSxRdzpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuUnc6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8CmE/dGhpcy5mbTp0aGlzLnhqKGEpfSx4ajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueWo6dGhpcy5YcyhhKX0sWHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zczp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmo6YX19fSkoYyk7dmFyIEFiPWMubG18fEFiLFJjPW5ldyBBYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVJjLiRzKDQpOyhmdW5jdGlvbihjKXtjLlZsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLmJmPSExfSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7CndpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuSnQoKX0uYmluZCh0aGlzKSw1MDApfSxKdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmJmJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLmJmKTsKdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LFp1OmZ1bmN0aW9uKCl7dGhpcy5iZj13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEJiPWMuVmx8fEJiOyhmdW5jdGlvbihjKXtjLlVsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5sYz0wfSxmOmZ1bmN0aW9uKCl7dGhpcy5Icz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMubGN8fCh0aGlzLmxjPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oKXt0aGlzLnMoImFkZXJyb3IiKTt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLAp0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy5zKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmxjfHx0aGlzLmxjKyssdGhpcy5sYzw9dGhpcy5Icz8odGhpcy5sYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMucygibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuWnUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7CnZhciBDYj1jLlVsfHxDYjsoZnVuY3Rpb24oYyl7Yy5XbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLGE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBCYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBDYihiLHRoaXMuSSkpLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIERiPWMuV2x8fERiLEViPW5ldyBEYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5RcD10aGlzLmFbN107dGhpcy5QdT10aGlzLmFbM107dGhpcy5RbT10aGlzLmFbNV07CnRoaXMueWw9dGhpcy5hWzFdO3RoaXMuenI9dGhpcy5hWzVdO3RoaXMuRmk9dGhpcy5hWzZdO3RoaXMuU3A9dGhpcy5hWzJdO3RoaXMuaj10aGlzLmFbNl19Yy5vbD1iO2IucHJvdG90eXBlPXtQcDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuUXA6dGhpcy5PdShhKX0sT3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlB1OnRoaXMuUG0oYSl9LFBtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5RbTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6dGhpcy55cihhKX0seXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnpyOnRoaXMuRWkoYSl9LEVpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5GaTp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBGYj1jLm9sfHxGYixTYz1uZXcgRmIoMSxuZXcgRGF0ZSwKMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9U2MuUHAoNCk7KGZ1bmN0aW9uKGMpe2MuU2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmCihhPWIuY3VycmVudFRpbWUpO3JldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxOYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgR2I9Yy5TbHx8R2I7KGZ1bmN0aW9uKGMpe2MuUmw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuSWEoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5uYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5vcCgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0uYmluZCh0aGlzKSk7Yj10aGlzLnBkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy55cygpOnRoaXMucGcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWWYoKXx8KHRoaXMucygiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxvcDpmdW5jdGlvbigpe3RoaXMuWWYoKXx8dGhpcy5tKCEwKX0seXM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBkKCk7IWIub2EmJmIuWCYmYi5FeCYmYi5HeCYmKHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxwZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGQoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOih0aGlzLnMoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBnKCl9LmJpbmQodGhpcyksMTAwKX0scGQ6ZnVuY3Rpb24oKXtpZighdGhpcy5CaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuSWEoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMuQmg9YltjXSk7cmV0dXJuIHRoaXMuQmh9LApaeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5wZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBIYj1jLlJsfHxIYjsoZnVuY3Rpb24oYyl7Yy5UbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBHYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEhiKGMsdGhpcy5JKSkuZigpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEliPWMuVGx8fEliLEpiPW5ldyBJYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Tbz10aGlzLmFbMTBdO3RoaXMubmw9dGhpcy5hWzZdO3RoaXMuRnY9dGhpcy5hWzJdO3RoaXMuaHE9dGhpcy5hWzVdO3RoaXMua3Q9dGhpcy5hWzhdO3RoaXMuVm49dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbMTBdfWMuVmo9YjtiLnByb3RvdHlwZT17Um86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlNvOnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5ubDp0aGlzLkV2KGEpfSxFdjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuRnY6dGhpcy5ncShhKX0sZ3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmhxOnRoaXMuanQoYSl9LApqdDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMua3Q6dGhpcy5VbihhKX0sVW46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmo6YX19fSkoYyk7dmFyIEtiPWMuVmp8fEtiLFRjPW5ldyBLYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVRjLlJvKDQpOyhmdW5jdGlvbihjKXtjLlZrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwphfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuWihhKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LFh4OmZ1bmN0aW9uKCl7dmFyIGI9ITE7MDw9ZS5HYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKS5pbmRleE9mKCJzcGllZ2VsLmRlIikmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBhdXNlKGIuaWQpfWVsc2Ugd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uc2VuZENvbW1hbmQoInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8KKHRoaXMucGF1c2UoKSwhMCk6ITF9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LE5jOmZ1bmN0aW9uKCl7cmV0dXJuITB9LElhOmZ1bmN0aW9uKCl7dmFyIGI7Rz8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTtyZXR1cm4gdGhpcy5jb250YWluZXJ9fSl9KShjKTt2YXIgWD1jLlZrfHxYOyhmdW5jdGlvbihjKXtjLlVrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmNmPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuY2Y9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9CmEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuY2YmJmIhPXRoaXMuY2Z8fCJhZGVycm9yIiE9YS5ldmVudHx8ZS50YSgidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobS5hZFRhZz1hLmFkVVJMKSx0aGlzLnMoImFkZXJyb3IiLGEuZXkpLHRoaXMuRygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5uYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJih0aGlzLnMoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLlVrfHxZOyhmdW5jdGlvbihjKXtjLldrPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmCndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtHPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGI7aWYoRylmb3IodmFyIGE9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1hLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhW2RdKSliPW5ldyBYKGIpLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9ZWxzZSBpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5oZigpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxMYj1jLldrfHxMYixNYj1uZXcgTGIoZ2EpO2M9Y3x8Cnt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Qcj10aGlzLmFbNl07dGhpcy5Gaj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVszXX1jLldzPWI7Yi5wcm90b3R5cGU9e09yOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Qcjp0aGlzLkVqKGEpfSxFajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuRmo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgTmI9Yy5Xc3x8TmIsVWM9bmV3IE5iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuT3IoNCk7KGZ1bmN0aW9uKGMpe2MuJGo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sdHU6ZnVuY3Rpb24oKXt9LHNhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sTGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGJ5OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE9iPWMuJGp8fE9iOyhmdW5jdGlvbihjKXtjLlpqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxmOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLk9uKCJhZEVycm9yIixmdW5jdGlvbihhKXsxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT8odGhpcy52KCksdGhpcy5wYSgpKToodGhpcy5zKCJhZGVycm9yIixhKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpO2IuT24oImZpcnN0UXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9LmJpbmQodGhpcykpO2IuT24oIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJ0aGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTtiLk9uKCJhZFN0YXJ0IixmdW5jdGlvbigpe3RoaXMudigpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMubmEoKX0uYmluZCh0aGlzKSl9LAptOmZ1bmN0aW9uKGIpe3RoaXMuRyhiKX19KX0pKGMpO3ZhciBQYj1jLlpqfHxQYjsoZnVuY3Rpb24oYyl7Yy5haz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrJiZ3aW5kb3cuR29yaWxsYU1lZGlhcGxheWVyRnJhbWV3b3JrLkdldEFsbFBsYXllcnMpe3ZhciBiPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycygpO2lmKGImJjA8Yi5sZW5ndGgpZm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBPYihiW2FdKTtjLm1hfHx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBQYihjLHRoaXMuSSkpLmYoKSl9fXRoaXMuVCgpfX0pfSkoYyk7dmFyIFFiPWMuYWt8fFFiLFJiPW5ldyBRYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuc3U9dGhpcy5hWzddO3RoaXMuT2o9dGhpcy5hWzRdO3RoaXMucXQ9dGhpcy5hWzRdO3RoaXMuWmw9dGhpcy5hWzVdO3RoaXMuZWs9dGhpcy5hWzEwXTt0aGlzLlJyPXRoaXMuYVsxMF07dGhpcy5maj10aGlzLmFbNF07dGhpcy5Odz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVsyXX1jLmtuPWI7Yi5wcm90b3R5cGU9e3J1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdTp0aGlzLk5qKGEpfSxOajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLk9qOnRoaXMucHQoYSl9LHB0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5xdDp0aGlzLllsKGEpfSxZbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpsOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lazp0aGlzLlFyKGEpfSxRcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuUnI6dGhpcy5laihhKX0sZWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmZqOnRoaXMuTXcoYSl9LApNdzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTnc6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBTYj1jLmtufHxTYixWYz1uZXcgU2IoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1WYy5ydSg0KTsoZnVuY3Rpb24oYyl7Yy5WbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihiJiZiWzBdKXtmb3IodmFyIGE9Yj1iWzBdO2EmJmEucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09YS5wYXJlbnROb2RlLm5vZGVOYW1lKXthPWEucGFyZW50Tm9kZTticmVha31hPWEucGFyZW50Tm9kZX10aGlzLlooYik7dGhpcy5WKGEpfWVsc2UgdGhpcy5jYSgpfSxRZDpmdW5jdGlvbihiKXt2YXIgYT0KITE7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/YT1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOnt9fSk6KGE9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkN1c3RvbUV2ZW50IiksYS5pbml0Q3VzdG9tRXZlbnQoYiwhMSwhMSxkYXRhKSk7YSYmd2luZG93LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYSl9LCR0OmZ1bmN0aW9uKCl7dGhpcy5XZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtY29tcGxldGVkIiksdGhpcy5XZD0hMX1jYXRjaChhKXt9aWYoImFkUmVxdWVzdCI9PWIuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuV2R8fCh0aGlzLldkPSEwLHRoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChjKXt9fX0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RoaXMuUWQoIngtZGw4LWhkLWNvbnRlbnQtcGF1c2UtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wYXVzZSgpfX0sCnBsYXk6ZnVuY3Rpb24oKXt0cnl7dGhpcy5RZCgieC1kbDgtaGQtY29udGVudC1yZXN1bWUtcmVxdWVzdGVkIil9Y2F0Y2goYil7dGhpcy52aWRlb1RhZy5wbGF5KCl9fSxMYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFRiPWMuVm18fFRiOyhmdW5jdGlvbihjKXtjLlVtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGR1OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy52KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IiwKZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnYoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuY2QoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5jZChhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLmNkKGEpfS5iaW5kKHRoaXMpKX0sY2Q6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy5zKCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwKMzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/dGhpcy52KCk6dGhpcy5tKCkpOih0aGlzLnMoIm5vZnJhbWV3b3JrIiksdGhpcy5tKCkpfSxVZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fX2RsOF9hZEVycm9yRXZlbnRCdWNrZXQpZm9yKHZhciBiPTA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy5jZCh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLndhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVWYuYmluZCh0aGlzKSwxMDApfSxmOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5kdSh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLlVmKCk7dGhpcy5jdSgpfSxjdTpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuWXQ/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwMCl9LGdvOmZ1bmN0aW9uKCl7dGhpcy5ZdD0hMH19KX0pKGMpO3ZhciBVYj1jLlVtfHxVYjsoZnVuY3Rpb24oYyl7Yy5XbT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuREw4X0dMT0JBTFMpe3ZhciBiPW5ldyBUYih3aW5kb3cuREw4X0dMT0JBTFMpO2IubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiLiR0KCksYj1uZXcgVWIoYix0aGlzLkkpLHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrfHwod2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2s9Yi5nby5iaW5kKGIpKSxiLmYoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgVmI9Yy5XbXx8VmIsV2I9bmV3IFZiKGdhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuRHQ9dGhpcy5hWzldO3RoaXMuVXA9dGhpcy5hWzddO3RoaXMudHM9dGhpcy5hWzVdO3RoaXMuS2o9dGhpcy5hWzhdO3RoaXMuQnA9dGhpcy5hWzZdO3RoaXMuUG89dGhpcy5hWzVdO3RoaXMudGs9dGhpcy5hWzZdO3RoaXMud3I9dGhpcy5hWzhdO3RoaXMuSWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuenE9YjtiLnByb3RvdHlwZT17Q3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkR0OnRoaXMuVHAoYSl9LFRwOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5VcDp0aGlzLnNzKGEpfSxzczpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudHM6dGhpcy5KaihhKX0sSmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Lajp0aGlzLkFwKGEpfSxBcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQnA6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlBvOnRoaXMuc2soYSl9LHNrOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMudGs6dGhpcy52cihhKX0sdnI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLndyOnRoaXMuSGwoYSl9LEhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5JbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIFhiPWMuenF8fFhiLFdjPW5ldyBYYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVdjLkN0KDQpOyhmdW5jdGlvbihjKXtjLnhtPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3RoaXMuRWg9ITE7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLlYoYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTsKY3x8KGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuWihjKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuTnM9YX0uYmluZCh0aGlzKSksYi52aWRlb01vZGVsLm9ic2VydmUoImR1cmF0aW9uIixmdW5jdGlvbihhKXt0aGlzLmR1cmF0aW9uPWF9LmJpbmQodGhpcykpKTp0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9ZWxzZSB0aGlzLmNhKCl9LHR1OmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0xO3JldHVybiBiLnZpZGVvTW9kZWwmJmIudmlkZW9Nb2RlbC5nZXQmJihhPWIudmlkZW9Nb2RlbC5nZXQoInZvbHVtZSIpLDA8YSk/ITE6ITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGxheSgpfSxMYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwuZ2V0KCJpc1BhdXNlZCIpPwohMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Oc30sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kdXJhdGlvbn0sUDpmdW5jdGlvbigpe3JldHVybiJ0djIifSxOYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYil7dGhpcy5QZChiKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPmImJihiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSk7dmFyIGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJjA8YiYmYSYmMDxhJiZiPj1hLTEmJiF0aGlzLkVoJiYodGhpcy5FaD0hMCx0aGlzLlcmJnRoaXMuVygpKX19KX0pKGMpO3ZhciBPPWMueG18fE87KGZ1bmN0aW9uKGMpe2Mud209di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sQWE6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy56ZSlpZih0aGlzLkVifHwodGhpcy5FYj0wKSx0aGlzLkViKyssMTU8dGhpcy5FYil7aWYod2luZG93LmltYSYmd2luZG93LmltYS5jb21tb24mJndpbmRvdy5pbWEuSW1hU2RrU2V0dGluZ3MmJndpbmRvdy5pbWEuY29tbW9uLmdldFZpZGVvTWV0YWRhdGEmJndpbmRvdy5pbWEuY29tbW9uLnRyaWdnZXJNZWFzdXJhYmxlRXZlbnQpcmV0dXJuIHdpbmRvdy5jYW5SdW5BZHM/dGhpcy5GdSgpOnRoaXMubSghMCksITA7dGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5tKCk6dGhpcy5tKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuemU9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy5zKCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSwxMCl9LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlM9YSxiLnMoImFkZXJyb3IiLGEpKTpiLnMoImFkZXJyb3IiKX1yZXR1cm4gY30KYi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuUz10aGlzLlN8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5BYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09CmEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBQPWMud218fFA7KGZ1bmN0aW9uKGMpe2MueW09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpO3RoaXMuV2E9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBPKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBPKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJndpbmRvdy5UVjJQbGF5ZXJzW2FdLnZpZGVvTW9kZWwmJgooYj1uZXcgTyh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFAoYix0aGlzLkkpLGIuZigpKSk7dGhpcy5oZigpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIFliPWMueW18fFliLFpiPW5ldyBZYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy4kdz10aGlzLmFbNl07dGhpcy5Wbz10aGlzLmFbN107dGhpcy5JbT10aGlzLmFbMl07dGhpcy5Jbj10aGlzLmFbNF07dGhpcy5TaT10aGlzLmFbNl07dGhpcy5oeD10aGlzLmFbN107dGhpcy5Eaj10aGlzLmFbMTBdO3RoaXMuVnI9dGhpcy5hWzEwXTt0aGlzLkNvPXRoaXMuYVsyXTt0aGlzLmo9dGhpcy5hWzhdfWMucHU9YjtiLnByb3RvdHlwZT17Wnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLiR3OnRoaXMuVW8oYSl9LFVvOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5WbzoKdGhpcy5IbShhKX0sSG06ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5JbTp0aGlzLkhuKGEpfSxIbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkluOnRoaXMuUmkoYSl9LFJpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5TaTp0aGlzLmd4KGEpfSxneDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaHg6dGhpcy5DaihhKX0sQ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Eajp0aGlzLlVyKGEpfSxVcjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVnI6dGhpcy5CbyhhKX0sQm86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Dbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciAkYj1jLnB1fHwkYixYYz1uZXcgJGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1YYy5adyg0KTsKKGZ1bmN0aW9uKGMpe2MuUGs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKTthJiZ0aGlzLlYoYS5wYXJlbnROb2RlKX0sUDpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWj1jLlBrfHxaOyhmdW5jdGlvbihjKXtjLk9rPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLmJoPTA7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPQp0aGlzLkljPXRoaXMuQWE9dGhpcy5aYz0hMTt0aGlzLkloPWUuSWIoMTApO3RoaXMubGgoKX0sbGg6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMub2E9Yi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcix0aGlzLnNiKCksITA7dGhpcy5iaCsrO2lmKDEwPHRoaXMuYmgpdGhpcy5zKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubSghMCk6dGhpcy5tKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5saC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5vYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiYKZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCk7dGhpcy5zKCJhZGVycm9yIix0aGlzLlMpOwp0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy53YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5TPWEsYi5zKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7CnJldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHZkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWF9LENhOmZ1bmN0aW9uKCl7dGhpcy5lYT0hMH0sZmE6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhPyh0aGlzLnYoKSx0aGlzLnBhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLkcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7CnZhciBhYT1jLk9rfHxhYTsoZnVuY3Rpb24oYyl7Yy5Raz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgWih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFood2luZG93LnBsYXllciksdGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IGFhKGIsdGhpcy5JKSxiLmYoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIGFjPWMuUWt8fGFjLGJjPW5ldyBhYyhyKTtjPQpjfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucHM9dGhpcy5hWzVdO3RoaXMuRHY9dGhpcy5hWzEwXTt0aGlzLmZuPXRoaXMuYVsxXTt0aGlzLnBrPXRoaXMuYVs2XTt0aGlzLlZ2PXRoaXMuYVszXTt0aGlzLmdrPXRoaXMuYVsxMF07dGhpcy52bT10aGlzLmFbNF07dGhpcy5qcD10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbM119Yy5Jaj1iO2IucHJvdG90eXBlPXtvczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLnBzOnRoaXMuQ3YoYSl9LEN2OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5Edjp0aGlzLmVuKGEpfSxlbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZm46dGhpcy5vayhhKX0sb2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnBrOnRoaXMuVXYoYSl9LFV2OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Wdjp0aGlzLmZrKGEpfSxmazpmdW5jdGlvbihhKXtyZXR1cm4gMjwKYT90aGlzLmdrOnRoaXMudW0oYSl9LHVtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy52bTp0aGlzLmlwKGEpfSxpcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuanA6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBjYz1jLklqfHxjYyxZYz1uZXcgY2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1ZYy5vcyg0KTsoZnVuY3Rpb24oYyl7Yy5Yaj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwKIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUDpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgZGM9Yy5Yanx8ZGM7KGZ1bmN0aW9uKGMpe2MuV2o9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZjpmdW5jdGlvbigpe3RoaXMub2coKX0sb2c6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMucygibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9nKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBlYz1jLldqfHxlYzsoZnVuY3Rpb24oYyl7Yy5Zaj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGY6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJgp3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2I9bmV3IGRjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihiLm1hKXt0aGlzLlQoKTtyZXR1cm59aWYoIXRoaXMuTihiKSl7dGhpcy5SKGIpOyhuZXcgZWMoYix0aGlzLkkpKS5mKCk7dGhpcy5UKCk7cmV0dXJufX10aGlzLlQoKX19KX0pKGMpO3ZhciBmYz1jLllqfHxmYyxnYz1uZXcgZmMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRWw9dGhpcy5hWzldO3RoaXMubnM9dGhpcy5hWzhdO3RoaXMueW89dGhpcy5hWzNdO3RoaXMueHQ9dGhpcy5hWzFdO3RoaXMuS2w9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzJdO3RoaXMuVmk9dGhpcy5hWzhdO3RoaXMucHE9dGhpcy5hWzNdO3RoaXMuY289dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbNV19Yy5McD1iO2IucHJvdG90eXBlPXtEbDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLkVsOnRoaXMubXMoYSl9LG1zOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5uczp0aGlzLnhvKGEpfSx4bzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMueW86dGhpcy53dChhKX0sd3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnh0OnRoaXMuSmwoYSl9LEpsOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5LbDp0aGlzLkpvKGEpfSxKbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS286dGhpcy5VaShhKX0sVWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZpOnRoaXMub3EoYSl9LG9xOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5wcTp0aGlzLmJvKGEpfSxibzpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNvOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuajphfX19KShjKTt2YXIgaGM9Yy5McHx8aGMsWmM9bmV3IGhjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVpjLkRsKDQpOyhmdW5jdGlvbihjKXtjLnlpPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2I/KHRoaXMuVihiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlooYik6dGhpcy5jYSgpKTp0aGlzLmNhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZVZpZGVvKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXlWaWRlbygpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkFWIn19KX0pKGMpO3ZhciBpYz1jLnlpfHxpYzsoZnVuY3Rpb24oYyl7Yy54aT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKYi5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm0uYmluZCh0aGlzKSwxMDApfS5iaW5kKHRoaXMpKTtiLm9uKCJhZEZyYW1ld29ya05vdEF2YWlsYWJsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7dGhpcy5xZSgpO3RoaXMubGcoKX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnMoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmCiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sdmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLmVhPSEwO3RoaXMudigiZW1wdHkgdmFzdCIpfSxsZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPQoiYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihjPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRzTG9hZGVyW2FdLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXthLmdldEVycm9yJiYoYT1hLmdldEVycm9yKCkpO3ZhciBiPSExO2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWI9ITA7aWYoIWIpZm9yKHZhciBjIGluIGEpe2lmKGFbY10mJmFbY10uaW5kZXhPZiYmKC0xIT1hW2NdLmluZGV4T2YoIjEwMDkiKXx8LTEhPWFbY10uaW5kZXhPZigiMzAzIil8fC0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLnYoKSx0aGlzLnBhKCkpOgp0aGlzLm0oKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmxnLmJpbmQodGhpcyksNTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQodGhpcy5xZS5iaW5kKHRoaXMpLDEwMCl9LHFlOmZ1bmN0aW9uKCl7aWYoIXRoaXMud2EoKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsicGxheWluZyI9PWIuZ2V0UGxheVN0YXRlKCk/Yi5nZXRBZEluZm8oKT8od2luZG93LnNldFRpbWVvdXQodGhpcy5uYS5iaW5kKHRoaXMpLDEwKSx0aGlzLnYoKSk6Yi5fcGxheWVyT3B0aW9ucyYmYi5fcGxheWVyT3B0aW9ucy5wbGF5QWR2ZXJ0aXNlbWVudHN8fGIuX2FkUmVnaXN0ZXJlZD90aGlzLm0oKTp0aGlzLm0oITApOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMucWUuYmluZCh0aGlzKSwxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLm5hLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgamM9Yy54aXx8amM7CihmdW5jdGlvbihjKXtjLnppPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sVGE6ZnVuY3Rpb24oYil7Yj1uZXcgaWMoYik7Yi5tYT90aGlzLlQoKTp0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBqYyhiLHRoaXMuSSkpLmYoKSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcylmb3IodmFyIGI9MDtiPHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy5UYSh3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlc1tiXSk7ZWxzZSB3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50P3RoaXMuVGEod2luZG93LnNldHVwUGxheWVyRWxlbWVudCk6dGhpcy5UKCl9fSl9KShjKTt2YXIga2M9Yy56aXx8a2MsbGM9bmV3IGtjKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkx2PXRoaXMuYVsxXTt0aGlzLkRpPQp0aGlzLmFbNF07dGhpcy5RaT10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVsyXX1jLndrPWI7Yi5wcm90b3R5cGU9e0t2OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Mdjp0aGlzLkNpKGEpfSxDaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGk6dGhpcy5QaShhKX0sUGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlFpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgbWM9Yy53a3x8bWMsJGM9bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9JGMuS3YoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMubmg9dGhpcy5waD10aGlzLm9oPSExO3RoaXMuQ2Q9W107dGhpcy5nZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIGJjP251bGw6YmMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSmI/bnVsbDpKYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBaYj9udWxsOlpiLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTWI/bnVsbDpNYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFdiP251bGw6V2IsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJiP251bGw6UmIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHFiP251bGw6cWIsT295YWxhOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBmYj9udWxsOmZiLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRWI/bnVsbDpFYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHpiP251bGw6emIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2YgbGM/bnVsbDpsYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuTmw9YjtiLnByb3RvdHlwZT17ZjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy4kcShhKTpbXSxiO3RoaXMucGg9ITA7aWYoYS5sZW5ndGgpe3RoaXMub2g9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuUGgoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLmdmKXtpZih0aGlzLm5oKWJyZWFrO2I9dGhpcy5nZltjXTt0aGlzLkNmKGIpJiYodGhpcy5DZC5wdXNoKGIpLHRoaXMuUGgoYikpfX0sQ2Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZgpwPyEwOiExfSwkcTpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz1hW2VdLGM9dGhpcy5nZltjXSx0aGlzLkNmKGMpJiZiLnB1c2goYyk7cmV0dXJuIGJ9LFBoOmZ1bmN0aW9uKGEpe3RoaXMuQ2YoYSkmJmEuZigpfSxhdjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgdCYmIXRoaXMub2gpZm9yKHRoaXMubmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uTWImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5NYil9fX0pKGMpO3ZhciBuYz1jLk5sfHxuYyxNPW5ldyBuYztNLmYoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xdz10aGlzLmFbMV07dGhpcy50cj10aGlzLmFbNl07dGhpcy5rbz10aGlzLmFbN107dGhpcy5qPXRoaXMuYVs3XX1jLm91PQpiO2IucHJvdG90eXBlPXtWdzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuV3c6dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnRyOnRoaXMuam8oYSl9LGpvOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5rbzp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmo6YX19fSkoYyk7dmFyIG9jPWMub3V8fG9jLGFkPW5ldyBvYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWFkLlZ3KDQpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oYyl7aWYoYy5lcnJvciBpbnN0YW5jZW9mIFJlZmVyZW5jZUVycm9yKXt2YXIgYj1jLmZpbGVuYW1lP2MuZmlsZW5hbWU6IiI7aWYoLTEhPWIuaW5kZXhPZigiaG9tYWQiKXx8LTEhPWIuaW5kZXhPZigiaGQtbWFpbiIpKWI9Yy5tZXNzYWdlP2MubWVzc2FnZToKIiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsxLGIuaW5kZXhPZigiaXMgbm90IiktMSksZS5FYyhrLlp2KSxlLnRyYWNrKCJzdGF0c19oZF92YXJkZWxldGVkIixjLCEwKSk6LTEhPWMuaW5kZXhPZigic2V0QCIpJiYoZS5FYyhrLlJzKSxlLnRyYWNrKCJzdGF0c19oZF92YXJub3RzZXQiLCIiLCEwKSl9fSk7dmFyIEU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7RS53aWR0aD0xO0UuaGVpZ2h0PTE7RS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJwbXRtdnMiKTtFLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoRSk7dmFyIGJkPUUuY29udGVudFdpbmRvdy5zZXRJbnRlcnZhbC5iaW5kKHdpbmRvdykscmM9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7CnZhciBJPW5ldyBKLG09ITE7SS5qYSgpO0kuaGgoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmphKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoSS5oaCgpLGZ1bmN0aW9uKGMpe218fChtPWMuZGV0YWlsKX0sITEpO0kuamEoKTt2YXIgY2Q9YmQoZnVuY3Rpb24oKXtlLkhnKHdpbmRvdyxJLlhyKCkse2lkOmNkfSl9LDUwMCksaWE9ZS5hYSgxMCk7ZWEoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Kcj10aGlzLmFbNF07dGhpcy5Zaz10aGlzLmFbOV07dGhpcy5Icj10aGlzLmFbMl07dGhpcy5Kdj10aGlzLmFbNF07dGhpcy5Ncz10aGlzLmFbN107dGhpcy5vaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs5XX1jLmNxPWI7Yi5wcm90b3R5cGU9e0lyOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Kcjp0aGlzLlhrKGEpfSwKWGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLllrOnRoaXMuR3IoYSl9LEdyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Icjp0aGlzLkl2KGEpfSxJdjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSnY6dGhpcy5McyhhKX0sTHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nczp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm9qOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5jcXx8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQuSXIoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkZoPXRoaXMuY29uZj10aGlzLm9iPXRoaXMucGxheWVyPW51bGw7dGhpcy53ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTsKdGhpcy5FZD0wO3RoaXMuSGg9ITE7dGhpcy5kZj1bXTtlLnFiKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5BaT1iO2IucHJvdG90eXBlPXtCdTpmdW5jdGlvbihhKXt0aGlzLkZoPWF9LG5mOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5iYj10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sd3U6ZnVuY3Rpb24oYSl7dGhpcy5vYj1hfSx2dTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sSGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBifSxPYzpmdW5jdGlvbihhLGIpe2UudGEoIndlbHQuZGUiKSYmZS5hYigiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKwoiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMub2IpO3ZhciBjPSExLGY9ITE7aWYodGhpcy5ZcigpKXRoaXMub2IubCh0aGlzLm9iLnJkLHRoaXMub2IudmEsdGhpcy5vYi5mZixmdW5jdGlvbigpe3RoaXMuT2MoYSxiKX0uYmluZCh0aGlzKSx0aGlzLm9iLkNjKTtlbHNlIGlmKHRoaXMubXIoKSl0aGlzLnF1KGZ1bmN0aW9uKCl7dGhpcy5PYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7ZS53KGsuZmQsdGhpcy5wbGF5ZXIudSgpKTt2YXIgZz10aGlzLmNvbmYsbD1uZXcgJGEodGhpcy5nZXRQbGF5ZXIoKSxnKTtiJiZsLmN2KCk7bC5leGl0RnVsbHNjcmVlbigpO2UucWIoIm5ld0hvbWFkRGlzcGxheSIpO1I9bD1uZXcgUmEobCx0aGlzLm9iLApnKTtsLnV1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5HcyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLk9lJiYoYz10aGlzLnBsYXllci5PZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5RZShhLGMsZik7dGhpcy5wbGF5ZXIuUmgobCl9fSxZcjpmdW5jdGlvbigpe3ZhciBhPW5ldyBEYXRlLGI9MDtpZih0aGlzLndkKXJldHVybiBiPWEuZ2V0VGltZSgpLXRoaXMud2QuZ2V0VGltZSgpLHRoaXMud2Q9YSwzRTU8Yj8hMDohMTt0aGlzLndkPWE7cmV0dXJuITF9LE51OmZ1bmN0aW9uKCl7ZS5xYigicHJlcm9sbCIpO2UubWYoInByZXJvbGwiKTsKdmFyIGE9dGhpcy5IYSgiYWRUYWciKTt0aGlzLkhhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5IYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuQmcoYSkpP3RoaXMuT2MoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLncoay5nZCx0aGlzLnBsYXllci51KCkpKX0sTXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuRmgpe2UubWYoInBvc3Ryb2xsIik7ZS5xYigicG9zdHJvbGwiKTt0aGlzLkJ1KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy5IYSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLkJnKGMpKT90aGlzLk9jKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwb3N0IiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLAplLncoay5nZCx0aGlzLnBsYXllci51KCkpKX19LEJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxndTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkh1KHRoaXMuTXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTmEoKX0sSmQ6ZnVuY3Rpb24oYSl7ZS5xYigibWlkcm9sbCIpO2UubWYoIm1pZHJvbGwiKTtpZighdGhpcy51aCl7dGhpcy51aD0hMDt2YXIgYj10aGlzLkhhKCJhZFRhZyIpO3RoaXMuSGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkhhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5PYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51aD0hMX0uYmluZCh0aGlzKSwxRTMpKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsIm1pZCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLncoay5nZCwKdGhpcy5wbGF5ZXIudSgpKSl9fSxmdTpmdW5jdGlvbigpe3RoaXMucGxheWVyLkF1KHRoaXMuSmQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuVGUoKX0sZjpmdW5jdGlvbigpe3RoaXMuTnUoKTt0aGlzLnBsYXllci5UZSYmdGhpcy5mdSgpO3RoaXMuZ3UoKX0saHU6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy5EZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMuZHgoYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLGFbYl0udXJsLGFbYl0ucGxhY2Vob2xkZXIsYVtiXS5hbGlhcyxhW2JdLm1hY3JvKX10aGlzLkVkPXRoaXMuRGQubGVuZ3RofSxtcjpmdW5jdGlvbigpe3ZhciBhPSExOzA8dGhpcy5FZCYmKGE9ITApO3JldHVybiBhfSwKcXU6ZnVuY3Rpb24oYSl7dGhpcy5IaD1hO2ZvcihhPTA7YTx0aGlzLkRkLmxlbmd0aDthKyspdGhpcy5EZFthXVsiZnVuY3Rpb24iXSh0aGlzLlJ0LmJpbmQodGhpcykpfSxSdDpmdW5jdGlvbihhKXt0aGlzLkVkLS07YSYmdGhpcy5kZi5wdXNoKGEpOzA+PXRoaXMuRWQmJnRoaXMuSGgoKX0sR3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuZGYubGVuZ3RoO2MrKyliPXRoaXMuZGZbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMuQWl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUG49dGhpcy5hWzJdO3RoaXMuQnE9dGhpcy5hWzddO3RoaXMuTm89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbNl19Yy5Sdj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gOTwKYT90aGlzLlBuOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5CcTp0aGlzLk1vKGEpfSxNbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBxYz1jLlJ2fHxxYyxlZD1uZXcgcWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1lZC5Obig0KX0pLmNhbGwoVm9jaGFpdmFqb29sYWlUaCxWb2NoYWl2YWpvb2xhaVRoKTsK
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
46.4.49.53
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.53.49.4.46.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 4516b6bbb2ebdbb75c5259a9a325525a2e9560a219c44d239a95738856873173
|
GET
H/1.1
|
200
OK
|
data
lb80.s400.meetrics.net/
|
43 B
308 B
|
35ms
34ms
|
Image
image/gif |
176.9.42.70
HETZNER-AS
|
|
General
- Full URL
- https://lb80.s400.meetrics.net/data?/wTLZKJOBALlnFFUkzFyCPLAAAAAAAABZLaAPAAAFAAZLaTCDTAPAAAhPAcGBBCDTAZBAAOA55A55A85B55A58E55A55AGAxwA3yAy1ArCDTAPBCAXUAKAAHYeNAPAAAYGArZAITfPAPAAAhPAcGBICDTAPAAAhPAEQAHbosAPBAA0EAMCAHl5/APTqAsEA6DAMbosASksFFGjAAAAAAAAAAAAEAAAZLaAAAAAAAHAklFzrF0vFwBFKAz0FhyF0zFlpF0lFUAkpFzwFfjF0jFfnFvsFltFukElfFzkFHAzwAx4Ey1AwBEMAxzA4yA23A43Ay2A3xANABkFYtBZpFlsFksFv2FlBFAAAAJA25Aw1Ax1A13A1BEKA04A45A4wAxyA03AKAylFj0FhuFnsFlyBKA04A45A4wAxyA03AKA04A45A4wAxyA03A4AlyAG0B00A0lAyGEkpFzwFfjF0jFfnFvsFltFukElfFzkFlyAGzF0hFy0FzlFp0FllByGEylFj0FhuFnsFlyBdhPAcGBtEA6DAFAAACDTAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFKqADTA
- 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
-
176.9.42.70
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h227.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
106ms
34ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
adex.js
Show response
dmp.theadex.com/d/285/5184/s/
|
39 KB
14 KB
|
53ms
52ms
|
Script
application/javascript |
89.163.159.106
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
272ms
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
|
95ms
32ms
|
Script
text/javascript |
52.18.18.165
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
495 B
|
95ms
41ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame 2187
Redirect Chain
-
https://ih.adscale.de/map?ssl=1&format=video
-
https://ih.adscale.de/map?ssl=1&format=video&nut&uu=dbdfdd4e12e94698aa56049e2fe898d8
|
0
0
|
95ms
94ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
launcher.js
Show response
sak.userreport.com/sdm/
|
58 KB
18 KB
|
185ms
52ms
|
Script
application/javascript |
143.204.214.51
Amazon.com
|
|
|
GET
H2
|
204
|
nid
ap-sync.nuggad.net/
|
0
297 B
|
40ms
13ms
|
Image
text/plain |
2600:9000:20bb:4a00:12:6213:9cc0:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
95ms
30ms
|
Script
text/plain |
85.114.144.106
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
-
85.114.144.106
, 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
2 KB
|
6ms
6ms
|
Script
application/javascript |
2600:9000:20bb:da00:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
32ms
32ms
|
Script
text/javascript |
52.18.18.165
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_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=-2&screen=1200x1600&mbr=db8a8c8e52a674ed14f1ecabf02a0091&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=831448833278
- 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.18.18.165
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-52-18-18-165.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- d682a58ae6689a2160e6b33f0de1f3df473f208dfc4ce218fdc283ae1a929688
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
124ms
31ms
|
Script
application/javascript |
54.154.35.6
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame 0650
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCESasBDwABiw3BsUkWsfABifABSfABSfABiUABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4205021767115897261
|
42 B
661 B
|
31ms
30ms
|
Image
image/gif |
52.18.18.165
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 19A1
|
0
0
|
161ms
37ms
|
Document
text/html |
34.248.95.73
Amazon.com
|
|
General
- Full URL
- https://adstax-match.adrtx.net/activation?receiverId=adaud
- Requested by
- Host: confiant-integrations.global.ssl.fastly.net
URL: https://confiant-integrations.global.ssl.fastly.net/prebid/201909241602/wrap.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
34.248.95.73
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-34-248-95-73.eu-west-1.compute.amazonaws.com
- Software
-
akka-http/10.1.9 /
- Resource Hash
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
661 B
|
32ms
31ms
|
Image
image/gif |
52.18.18.165
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
/
Show response
tt.onthe.io/
|
0
287 B
|
133ms
36ms
|
XHR
text/javascript |
188.40.118.169
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&1569532601754
- 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.118.169
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.169.118.40.188.clients.your-server.de
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|