GET
H2
|
200
|
Primary Request
/
Show response
www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
|
146 KB
53 KB
|
186ms
119ms
|
Document
text/html |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
source-sans-pro-v11-latin-700.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
15 KB
|
38ms
31ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-700.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
|
GET
H2
|
200
|
source-sans-pro-v11-latin-600.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
15 KB
16 KB
|
40ms
34ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-600.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
|
GET
H2
|
200
|
source-sans-pro-v11-latin-regular.woff2
www.giga.de/static-local/dist/assets/fonts/source-sans-pro/
|
16 KB
16 KB
|
41ms
36ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
General
- Full URL
- https://www.giga.de/static-local/dist/assets/fonts/source-sans-pro/source-sans-pro-v11-latin-regular.woff2
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.10
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
|
GET
H2
|
200
|
lux.js
Show response
cdn.speedcurve.com/js/
|
19 KB
7 KB
|
92ms
27ms
|
Script
application/javascript |
151.101.114.217
Fastly
|
|
General
- Full URL
- https://cdn.speedcurve.com/js/lux.js?id=131387135
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.217
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
Apache /
- Resource Hash
- 8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H2
|
200
|
pre-c6082d08a1.js
Show response
www.giga.de/static-local/dist/assets/js/
|
59 KB
19 KB
|
56ms
49ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
main-desktop-6c1403c088.css
www.giga.de/static-local/dist/assets/css/
|
356 KB
49 KB
|
48ms
41ms
|
Stylesheet
text/css |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.1
|
200
OK
|
iam.js
Show response
script.ioam.de/
|
34 KB
11 KB
|
91ms
31ms
|
Script
application/javascript |
91.215.103.64
INFONLINE-AS
|
|
|
GET
H2
|
200
|
metaTag.min.63561e19b5b6ce585f28cead7b205a9a.js
Show response
js.stroeermediabrands.de/
|
260 KB
63 KB
|
129ms
34ms
|
Script
application/javascript |
46.253.113.178
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
2501-rcm40x40.jpg
static.giga.de/wp-content/uploads/2015/05/
|
796 B
1 KB
|
108ms
34ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2015/05/2501-rcm40x40.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- aad43962cf32b81533449a96ca4937f1399e018c07822a86450a2ba0a5d7794a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
adsbygoogle.js
Show response
pagead2.googlesyndication.com/pagead/js/
|
98 KB
35 KB
|
23ms
21ms
|
Script
text/javascript |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
cafe /
- Resource Hash
- c7acf6cccd52ba69af984311ffa15a9c36ec5c52ca0df6903a1b6355c4b25149
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
1.gif
www.gstatic.com/psa/static/
|
53 B
145 B
|
8ms
6ms
|
Image
image/gif |
2a00:1450:4001:824::2003
Google LLC
|
|
General
- Full URL
- https://www.gstatic.com/psa/static/1.gif
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:824::2003
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 1eddc73cd37d151291adc510a4a547c4b0248b5bf7d368fcf4b73840a75b819a
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
Siri-Geld-verschicken-PayPal-rcm235x129.jpg
static.giga.de/wp-content/uploads/2016/11/
|
6 KB
6 KB
|
97ms
33ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://static.giga.de/wp-content/uploads/2016/11/Siri-Geld-verschicken-PayPal-rcm235x129.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 40447fb0b243730fcdc6a8a094cf9d400ce1ec01e89ab80e15142ce294f49fa8
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H/1.1
|
200
OK
|
trackcp.js
Show response
gocp.stroeermediabrands.de/
|
27 KB
10 KB
|
136ms
31ms
|
Script
application/javascript |
188.40.16.106
HETZNER-AS
|
|
|
GET
H/1.1
|
200
OK
|
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
-
https://ssl-econa.met.vgwort.de/na/aed5432c7f5c4a7c8eccb40d68e02ce1
-
https://ssl-econa.met.vgwort.de/blank.gif
|
43 B
310 B
|
24ms
24ms
|
Image
image/gif |
161.156.66.178
SoftLayer Technol...
|
|
|
GET
H2
|
200
|
tr
www.facebook.com/
|
44 B
248 B
|
7ms
6ms
|
Image
image/gif |
2a03:2880:f12d:83:face:b00c:0:25de
Facebook
|
|
|
GET
H2
|
200
|
analytics.js
Show response
www.google-analytics.com/
|
43 KB
17 KB
|
7ms
5ms
|
Script
text/javascript |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/analytics.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c6082d08a1.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
H2
|
200
|
apstag.js
Show response
c.amazon-adsystem.com/aax2/
|
75 KB
22 KB
|
131ms
54ms
|
Script
application/javascript |
99.84.157.237
Amazon.com
|
|
|
GET
H2
|
200
|
init
Show response
d.nativendo.de/cds/delivery/
|
991 B
918 B
|
81ms
35ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
identitystatus
Show response
irqs.ioam.de/
|
25 B
203 B
|
91ms
29ms
|
XHR
application/vnd.api+json |
193.46.63.75
INFONLINE-AS
|
|
General
- Full URL
- https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=software_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.7276372934768334
- Requested by
- Host: script.ioam.de
URL: https://script.ioam.de/iam.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
193.46.63.75
Alfter, Germany,
ASN43407
(INFONLINE-AS, NL),
- Reverse DNS
- irqs.ioam.de
- Software
-
nginx /
- Resource Hash
- 9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=15768000 |
|
GET
H/1.1
|
200
OK
|
blank.gif
de.ioam.de/
Redirect Chain
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=00090590172b137a05d8c5899&ep=1599937500...
-
https://de.ioam.de/tx.io?st=giga&cp=software_content&sv=in&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=NL%2FNoord-Holland&cb=0009&i2=00090590172b137a05d8c5899&ep=1599937500...
-
https://de.ioam.de/blank.gif
|
43 B
651 B
|
30ms
30ms
|
Image
image/gif |
91.215.103.65
INFONLINE-AS
|
|
|
GET
H2
|
200
|
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
|
9 KB
10 KB
|
38ms
38ms
|
Font
application/octet-stream |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
176875
Show response
videos.giga.de/embed/
Frame 4650
|
9 KB
3 KB
|
134ms
47ms
|
Document
text/html |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
bg-teaser.png
www.giga.de/wp-content/themes/project/assets/img/teaser/
|
647 B
865 B
|
35ms
34ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
js
Show response
www.google-analytics.com/gtm/
|
81 KB
26 KB
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:815::200e
Google LLC
|
|
|
GET
H2
|
200
|
integrator.js
Show response
adservice.google.de/adsid/
|
109 B
171 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81a::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.de/adsid/integrator.js?domain=www.giga.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:81a::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
15ms
|
Script
application/javascript |
2a00:1450:4001:81a::2002
Google LLC
|
|
General
- Full URL
- https://adservice.google.com/adsid/integrator.js?domain=www.giga.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:81a::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
|
show_ads_impl.js
Show response
pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/
|
227 KB
84 KB
|
30ms
30ms
|
Script
text/javascript |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::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 6DDF
|
0
0
|
6ms
6ms
|
Document
text/html |
2a00:1450:4001:81e::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:81e::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.0
|
200
OK
|
z.js
Show response
go.giga-abs.de/
|
1 KB
1 KB
|
129ms
30ms
|
Script
text/javascript |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/z.js?0.30731148757404814
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 7c3a2ecb6d02d9a4f63089cd70829abb89b1ed69a415ef936b4f29f311a02551
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
|
GET
H/1.1
|
200
OK
|
Cookie set
iframe
tracking.m6r.eu/pixel/
Frame 5D89
Redirect Chain
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA+Software
-
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
|
0
0
|
40ms
40ms
|
Document
text/html |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Software&checkcookies=true
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- 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
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
|
44 KB
14 KB
|
20ms
20ms
|
Script
text/javascript |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/tag/js/gpt.js
- Requested by
- Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.63561e19b5b6ce585f28cead7b205a9a.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8f34bd63743779956176a9fe36dba32cd8c0b31b86d25266024cc4767e89ca0f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
yieldlove-bidder-stroeer.js
Show response
cdn-a.yieldlove.com/
|
287 KB
89 KB
|
145ms
52ms
|
Script
application/javascript |
99.84.151.41
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
mtrcs_679600.js
Show response
s400.mxcdn.net/bb-mx/serve/
|
124 KB
48 KB
|
96ms
42ms
|
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
599 B
|
175ms
175ms
|
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
|
226ms
50ms
|
Script
text/javascript |
80.82.201.88
UNBELIEVABLE-AS
|
|
|
GET
H/1.1
|
200
OK
|
ad-loading.gif
www.dunkirkinception.com/detect/
|
125 B
436 B
|
373ms
31ms
|
Image
image/png |
35.156.29.62
Amazon.com
|
|
|
GET
H2
|
200
|
tag.js
Show response
js.agkn.com/prod/v0/
|
3 KB
3 KB
|
52ms
14ms
|
Script
application/javascript |
2600:9000:2000:7a00:15:efbc:e300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
post-98578dc5ad.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
7 KB
3 KB
|
33ms
32ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
giga-6b59f15322.js
Show response
www.giga.de/static-local/dist/assets/js/bundle/
|
31 KB
12 KB
|
34ms
33ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
smb-phone-plan-ef34ebe4f8.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
|
53 KB
18 KB
|
34ms
34ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame 0C22
|
0
0
|
266ms
266ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=3875064957&adk=2210344608&adf=1301661270&w=468&lmt=1569478809&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&flash=0&wgl=1&dt=1569478809419&bpp=9&bdt=161&fdt=108&idt=108&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&correlator=6463978029949&frm=20&pv=2&ga_vid=626121737.1569478809&ga_sid=1569478810&ga_hid=1121615014&ga_fc=0&iag=0&icsg=8796909339640&dssz=56&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=318&ady=446&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199335&oid=3&pvsid=1930806405639758&rx=0&eae=0&fc=912&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=a!1&fsb=1&xpc=TxHkHWDKnq&p=https%3A//www.giga.de&dtd=119
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::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
|
20ms
20ms
|
Script
text/javascript |
2a00:1450:4001:81e::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
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::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
|
collect
www.google-analytics.com/r/
|
35 B
108 B
|
14ms
13ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=1121615014&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=6GBAAEADQ~&jid=606429536&gjid=2094326234&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&_r=1&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&z=718236642
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
collect
www.google-analytics.com/
|
35 B
105 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Image%20Gallery&ea=embed&el=4282584&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd21=auto&cm17=1&cd18=4282584&z=146482777
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
article-rating-7143c629e5.js
Show response
www.giga.de/static-local/dist/assets/js/components/
|
306 B
534 B
|
32ms
32ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
|
156 KB
57 KB
|
60ms
59ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
506 B
|
457ms
456ms
|
XHR
text/javascript |
99.84.157.237
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=9150794382391569478809556&cb=2347555300221569478809558&ws=1600x1200&v=7.36.02&t=1000&slots=%5B%7B%22sd%22%3A%22banner-1%22%2C%22s%22%3A%5B%22728x90%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%22sky-2%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%22rectangle-4%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
99.84.157.237
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-99-84-157-237.txl52.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- fe872181561e999370578b7dcd291f71a326c35c008f10ec474c8b16502d25be
|
GET
H2
|
200
|
aps_csm.js
Show response
c.amazon-adsystem.com/bao-csm/aps-comm/
|
6 KB
3 KB
|
109ms
35ms
|
XHR
application/javascript |
99.84.157.237
Amazon.com
|
|
|
GET
H2
|
200
|
loader.js
Show response
c.nativendo.de/cdn/asset/js/
|
53 KB
17 KB
|
77ms
22ms
|
Script
application/javascript |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H2
|
200
|
ads
googleads.g.doubleclick.net/pagead/
Frame CE82
|
0
0
|
17ms
17ms
|
Document
text/html |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1569478809&plat=1%3A32776%2C2%3A16809992%2C8%3A32776%2C9%3A32776%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1569478809489&bpp=5&bdt=231&fdt=74&idt=74&shv=r20190924&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=6463978029949&frm=20&pv=1&ga_vid=626121737.1569478809&ga_sid=1569478810&ga_hid=1121615014&ga_fc=0&iag=0&icsg=2392550363119592&dssz=61&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=20199335&oid=3&pvsid=1930806405639758&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=a!1&fsb=1&dtd=77
- Requested by
- Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20190924/r20190131/show_ads_impl.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:81e::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
|
dkuim.js
Show response
dkuim.de/api/js/2/
|
465 KB
151 KB
|
394ms
49ms
|
Script
application/javascript |
178.19.65.130
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
videojs-02e1d46d.min.js
Show response
videos.giga.de/dist/js/embed/bundle/
Frame 4650
|
618 KB
206 KB
|
40ms
39ms
|
Script
application/javascript |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ima3.js
Show response
imasdk.googleapis.com/js/sdkloader/
Frame 4650
|
263 KB
89 KB
|
39ms
38ms
|
Script
text/javascript |
2a00:1450:4001:806::200a
Google LLC
|
|
|
GET
H2
|
200
|
platform.js
Show response
apis.google.com/js/
|
43 KB
17 KB
|
40ms
28ms
|
Script
application/javascript |
2a00:1450:4001:818::200e
Google LLC
|
|
General
- Full URL
- https://apis.google.com/js/platform.js
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-c6082d08a1.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:818::200e
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
ESF /
- Resource Hash
- 1a560979c35508f894818e1f68012f0a56d6a6001c5dfb73ffeda325fcbafbeb
- Security Headers
-
Name |
Value |
Strict-Transport-Security |
max-age=31536000 |
X-Content-Type-Options |
nosniff |
X-Frame-Options |
SAMEORIGIN |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
loader.js
Show response
cdn.taboola.com/libtrc/stroeer-smb-giga/
|
113 KB
22 KB
|
31ms
29ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm75=1&z=1702244227
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
5ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal-Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%202&cm75=1&z=561563726
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Login-Seite&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%203&cm75=1&z=1841853146
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Hier%20loggt%20ihr%20euch%20in%20Paypal%20ein.&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Image&cd40=https%3A%2F%2Fwww.paypal.com%2Fsignin%2F%3Fcountry.x%3Dde%26locale.x%3Dde_de&cd41=Content%204&cm75=1&z=1877918731
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Android)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmy&cd41=Content%205&cm75=1&z=2057994604
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(iOS)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixmz&cd41=Content%206&cm75=1&z=868193962
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Paypal%20(Windows%20Phone)%20downloaden%20*&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fixn0&cd41=Content%207&cm75=1&z=444105524
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
H/1.1
|
200
OK
|
Cookie set
/
d.agkn.com/iframe/8613/
Frame D316
|
0
0
|
116ms
29ms
|
Document
text/html |
18.195.227.0
Amazon.com
|
|
General
- Full URL
- https://d.agkn.com/iframe/8613/?che=393920802&gdpr=1&gdpr_consent=&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%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
-
18.195.227.0
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-18-195-227-0.eu-central-1.compute.amazonaws.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
|
GET
H2
|
200
|
videojs-f50f7a8d.css
videos.giga.de/dist/css/
Frame 4650
|
53 KB
15 KB
|
63ms
63ms
|
Stylesheet
text/css |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
play_button.svg
videos.giga.de/image/
Frame 4650
|
1015 B
1 KB
|
63ms
63ms
|
Image
image/svg+xml |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
jquery.min.js
Show response
ajax.googleapis.com/ajax/libs/jquery/3.2.1/
|
85 KB
30 KB
|
6ms
6ms
|
Script
text/javascript |
2a00:1450:4001:814::200a
Google LLC
|
|
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=deutsche%20Paypal-Webseite&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd39=Text-link&cd40=https%3A%2F%2Fwww.paypal.com%2Fde%2Fcgi-bin%2Fwebscr%3Fcmd%3D_login-run&cd41=Content%201&cm76=1&z=951925094
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
H/1.1
|
200
OK
|
submit
lb35.s400.meetrics.net/bb-mx/
|
43 B
291 B
|
385ms
34ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/bb-mx/submit?/gwzmBGAAA/whFfBo0F0wFz6BvvA33F3uBnpFnhFukElvB3lFihFwwFzvBwhF5wFhsFv0EpwFwzFvwEh5FwhFstBsvFnpFutBzvFtnEloF0zFt1EukFtzEvtBsvFlzF0tBpoFytBsvFnpFutBwyFviFslFtlFvBEfpyF+k2FmywAx5AtwA3tAx2AtxA16A14At2A35A2wAwtAyuAxxAytA5mEw0AxzAj0BL2wFBLl1FC/2xFMCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSaKBPAAAAAAAAAOAAAAGAAAAAAAZwSaKBBRksFAQtjFvre9SA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
419ms
34ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
|
GET
H2
|
200
|
smb-article-rating-f9506c2d61.min.js
Show response
www.giga.de/static-local/dist/assets/js/vendor/smb-article-rating/
|
18 KB
6 KB
|
33ms
33ms
|
Script
text/javascript |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
31ms
30ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
General
- Full URL
- https://go.giga-abs.de/o.gif?__ir=&__is=1600_1200_24&__iu=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&__id=1569478809633&__it=-120&__ic=727391&__iq=accbfcfe57edf302d3eada3add7b5e61&__ig=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.0
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.72.20
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
X/1.0 /
- Resource Hash
- 2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
|
GET
H2
|
200
|
bootstrap.min.js
Show response
maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/
|
36 KB
10 KB
|
20ms
7ms
|
Script
text/javascript |
2001:4de0:ac19::1:b:1b
Highwinds Network...
|
|
|
GET
H2
|
200
|
impl.20190919-3-RELEASE.js
Show response
cdn.taboola.com/libtrc/
|
393 KB
111 KB
|
30ms
30ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H/1.1
|
200
OK
|
beacon.js
Show response
sb.scorecardresearch.com/
|
1 KB
1 KB
|
1106ms
29ms
|
Script
application/x-javascript |
2.19.43.224
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
nativendo.css
c.nativendo.de/cdn/asset/css/
|
5 KB
1 KB
|
16ms
16ms
|
Stylesheet
text/css |
2606:4700:20::6819:ac0d
Cloudflare
|
|
|
GET
H2
|
200
|
json
Show response
trc.taboola.com/stroeer-smb-giga/trc/3/
|
16 KB
7 KB
|
299ms
299ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=08%3A20%3A09.775<i=deflated&data=%7B%22id%22%3A978%2C%22ii%22%3A%22%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1569478809770%2C%22cv%22%3A%2220190919-3-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F%22%2C%22bv%22%3A%220%22%2C%22ul%22%3A%5B%22en-US%22%5D%2C%22cmps%22%3A3%2C%22btv%22%3A%220%22%2C%22cos%22%3A%224g%22%2C%22bad%22%3A-1%2C%22sw%22%3A1600%2C%22sh%22%3A1200%2C%22bw%22%3A1600%2C%22sde%22%3A%221.000%22%2C%22bh%22%3A1200%2C%22dw%22%3A1585%2C%22dh%22%3A4762%2C%22r%22%3A%5B%7B%22li%22%3A%22rbox-t2m%22%2C%22s%22%3A9%2C%22uim%22%3A%22alternating-thumbnails-a%3Aabp%3D0%22%2C%22uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22orig_uip%22%3A%22Below%20Article%20Feed%20-%20Video%22%2C%22cd%22%3A3055.3125%2C%22mw%22%3A625%7D%5D%2C%22cb%22%3A%22TRC.callbacks.recommendations_1%22%2C%22lt%22%3A%22deflated%22%7D
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- eceb58cdeadde2213393f6a0820712d4cba352fbb67b7d00af86c46c0e41c88f
|
GET
H2
|
200
|
145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
files.giga-video.de/75/ed/96/
Frame 4650
|
30 KB
30 KB
|
363ms
47ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
General
- Full URL
- https://files.giga-video.de/75/ed/96/145a0649de4fb235240e99e26c_ciA2NTADN2QxYTRlYjUwOTY=.jpg
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
178.19.70.100
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.10.3 /
- Resource Hash
- 00dbbd574387178311a123fd5add4544605ba593ce9a2b711e6937555255fafd
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
1; mode=block |
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
99 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=176875%20--%20so-funktioniert-paypal-hd.mp4%5Bvideojs%2F7.6.0%5D%5BUser%20Click2Play%5D&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cd9=201406&cd11=176875&cd12=PRESS&cd13=62&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.0&cd44=1&cm1=1&z=1500012940
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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
H/1.1
|
200
OK
|
api
Show response
cdn.m6r.eu/sync/
|
1 KB
1 KB
|
1109ms
30ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
BLOB
|
200
OK
|
9918acd9-b0d7-477c-a7a8-efba9906e8f2
https://videos.giga.de/
Frame 4650
|
31 B
0
|
|
Other
application/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 4650
|
53 B
642 B
|
1392ms
36ms
|
XHR
application/json |
52.219.73.88
Amazon.com
|
|
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 4650
|
265 B
436 B
|
36ms
35ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
/
Show response
d.nativendo.de/cds/delivery/get/
|
6 KB
2 KB
|
51ms
51ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 4650
|
653 B
1 KB
|
3154ms
38ms
|
XHR
application/json |
52.84.163.227
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
config.js
Show response
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
|
50 KB
13 KB
|
1085ms
25ms
|
Script
text/javascript |
151.101.13.194
Fastly
|
|
|
POST
H/1.1
|
200
OK
|
native
Show response
native.adscale.de/
Redirect Chain
-
https://native.adscale.de/native
-
https://native.adscale.de/native?uu=3439fdd8402e4bd29644faee5e9ca6c4
|
157 B
603 B
|
89ms
88ms
|
XHR
application/json |
104.111.246.233
Akamai Technologies
|
|
|
GET
H2
|
200
|
adslots.-ecTGK0.gif
www.giga.de/imagez/
|
71 B
474 B
|
60ms
59ms
|
Image
image/png |
178.19.72.10
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
11 KB
5 KB
|
247ms
246ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4127213489058151&correlator=146968329567255&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21062724&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=800x450%7C580x500%7C580x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D17%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26keywords%3D%26amznbid%3D0%26amznp%3D0%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26mbrStatus%3Dcalled-idfound%26mbrid%3D400ba9b7a2a0cf36b1673cdc2bd84db6%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65&cookie_enabled=1&bc=31&abxe=1&lmt=1569478810&dt=1569478810069&dlt=1569478809258&idt=410&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3541345729&uci=1&ifi=2&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=73&icsg=855970873880608&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=626121737.1569478809&ga_sid=1569478810&ga_hid=1121615014&fws=128&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.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ec42eaab508e41a8399ea5ec5f7b6c35d963e6f3d0250bf539f84670f0241555
- 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
|
89ms
89ms
|
Script
text/javascript |
172.217.16.162
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:81e::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:81e::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/
|
3 KB
2 KB
|
243ms
242ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4127213489058151&correlator=146968329567255&output=ldjh&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21062724&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=1x1&ists=1&scp=as%3Dout-of-page%26adslot%3Dout-of-page%26pc%3D1&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D17%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26keywords%3D%26amznbid%3D0%26amznp%3D0%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26mbrStatus%3Dcalled-idfound%26mbrid%3D400ba9b7a2a0cf36b1673cdc2bd84db6%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65&cookie_enabled=1&bc=31&abxe=1&lmt=1569478810&dt=1569478810080&dlt=1569478809258&idt=410&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2858038163&uci=2&ifi=3&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=74&icsg=855970873880608&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x-1&msz=1x-1&ga_vid=626121737.1569478809&ga_sid=1569478810&ga_hid=1121615014&fws=640&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.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- c76680c1aa727b9849dd3d94271ff5f2ef1d1c1f01d2d3c90237e018d24d1f8d
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
Cookie set
iu3
aax-eu.amazon-adsystem.com/s/
Frame F170
Redirect Chain
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox
-
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
|
0
0
|
215ms
214ms
|
Document
text/html |
52.94.216.48
Amazon.com
|
|
General
- Full URL
- https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=ox&dcc=t
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.94.216.48
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- Software
-
Server /
- Resource Hash
|
GET
H2
|
200
|
tb
Show response
15.taboola.com/
|
30 KB
31 KB
|
42ms
41ms
|
Script
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://15.taboola.com/tb?oid=15&pubnm=stroeer-smb-giga&unitType=244&tbloc=&pageType=text&pstn=Below%20Article%20Feed%20-%20Video&uuip=Feed%20-%20Below%20Article%20Feed%20-%20Video&cisrf=&cirf=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&encoded=1&uid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&variant=895971|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1569478810096&tagid=&cntry=NL&platform=1&sesid=eb317bcfe62d601faf417e90ba5a8aa6&itemid=/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme&viewid=1569478809770&geolat=&geoing=&deviceifa=&appid=&sd=v2_eb317bcfe62d601faf417e90ba5a8aa6_d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19_1569478809_1569478809_CNawjgYQrMVBGKqx6OHWLSABKAEwoQE4l-oLQJmXEEiBzxtQ____________AVgAYAA&ri=86709fe5493762cbb82098a940455046&appname=&cdb=&gdprApplies=&rid=&sii=333075201540415599
- Requested by
- Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20190919-3-RELEASE.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- 395e2f3f83f52c91b42f83743751407a0649582ee904d6c4d6412774c7765d27
|
GET
H2
|
200
|
feed-card-placeholder.20190919-3-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
5 KB
2 KB
|
29ms
29ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
f89e1763-220d-4e09-ba69-9e040548fb7a.svg
cdn.taboola.com/static/f8/
|
4 KB
2 KB
|
29ms
29ms
|
Image
image/svg+xml |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
userx.20190919-3-RELEASE.es6.js
Show response
cdn.taboola.com/libtrc/
|
22 KB
8 KB
|
28ms
28ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
204
|
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/
Frame 4920
Redirect Chain
-
https://rtb.mfadsrvr.com/sync?ssp=taboola
-
https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
-
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=8e70e78e-f9e8-4451-be68-099e557d7e21
|
0
49 B
|
37ms
36ms
|
Image
text/plain |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=8e70e78e-f9e8-4451-be68-099e557d7e21
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
204
No Content
|
sync.php
pixel.rubiconproject.com/exchange/
Frame 4920
|
0
239 B
|
34ms
33ms
|
Image
image/gif |
69.173.144.165
The Rubicon Project
|
|
General
- Full URL
- https://pixel.rubiconproject.com/exchange/sync.php?p=16698
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
RSA, AES_256_GCM
- Server
-
69.173.144.165
Frankfurt am Main, Germany,
ASN26667
(RUBICONPROJECT - The Rubicon Project, Inc., US),
- Reverse DNS
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/
Frame 4920
Redirect Chain
-
https://px.powerlinks.com/user/identify?sourceId=d4a7a706-ab0f-11e8-a038-127202fb7690&rurl=https%3A%2F%2Ftrc.taboola.com%2Fsg%2Fpowerlinksdsp-network%2F1%2Frtb-h%2F%3Ftaboola_hm%3D%24%7BUSER%7D
-
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=hP-zQQWmxklM1nBTB6Vi7dAXekpf3bheIVED3QSJ6wI%3D
|
45 B
226 B
|
37ms
37ms
|
Image
image/gif |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=hP-zQQWmxklM1nBTB6Vi7dAXekpf3bheIVED3QSJ6wI%3D
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx /
- Resource Hash
- dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame 4920
|
43 B
689 B
|
19ms
18ms
|
Image
image/gif |
185.33.223.210
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/google-network/1/
Frame 4920
Redirect Chain
-
https://cm.g.doubleclick.net/pixel?google_nid=taboola_dbm&google_cm&google_sc
-
https://trc.taboola.com/sg/google-network/1/rtb-h/?taboola_hm=CAESEB4OBkTC5zlhrylWuxI3i3Y&google_cver=1
-
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEB4OBkTC5zlhrylWuxI3i3Y&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3DCAESEB4OBkTC5zlhrylWuxI3i3Y%26goo...
|
0
53 B
|
43ms
43ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESEB4OBkTC5zlhrylWuxI3i3Y&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3DCAESEB4OBkTC5zlhrylWuxI3i3Y%26google_cver%3D1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
getuidnb
ib.adnxs.com/
Frame 4920
|
43 B
688 B
|
22ms
21ms
|
Image
image/gif |
185.33.223.210
AppNexus
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/thetradedesk-network/1/
Frame 4920
Redirect Chain
-
https://match.adsrvr.org/track/cmf/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://match.adsrvr.org/track/cmb/generic?ttd_pid=054f32o&ttd_tpi=1
-
https://trc.taboola.com/sg/thetradedesk-network/1/rtb-h/?taboola_hm=62d84748-1750-4c7c-a9e1-171a3767912f
-
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=62d84748-1750-4c7c-a9e1-171a3767912f&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3D62d84748-1750-4c7c...
|
0
52 B
|
37ms
36ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=62d84748-1750-4c7c-a9e1-171a3767912f&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3D62d84748-1750-4c7c-a9e1-171a3767912f
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/storygize-network/1/
Frame 4920
Redirect Chain
-
https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19
-
https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=d0b85b76-69c8-4f9b-a970-81c6116fc863
-
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=d0b85b76-69c8-4f9b-a970-81c6116fc863&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3Dd0b85b76-69c8-4f9b-a9...
|
0
52 B
|
36ms
36ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=d0b85b76-69c8-4f9b-a970-81c6116fc863&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3Dd0b85b76-69c8-4f9b-a970-81c6116fc863
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
cookiesync
bttrack.com/pixel/
Frame 4920
|
35 B
380 B
|
651ms
102ms
|
Image
image/gif |
192.132.33.46
Bidtellect Inc.
|
|
|
GET
H/1.1
|
200
OK
|
/
cds.taboola.com/
Frame 4920
|
0
292 B
|
1668ms
187ms
|
Image
text/plain |
130.211.13.252
Google LLC
|
|
|
GET
H2
|
200
|
rtb-h
match.taboola.com/sg/bidswitch-network/1/
Frame 4920
Redirect Chain
-
https://x.bidswitch.net/sync?ssp=taboola
-
https://x.bidswitch.net/ul_cb/sync?ssp=taboola
-
https://ads.programattik.com/sync?ssp=bidswitch&bidswitch_ssp_id=taboola
-
https://ads.programattik.com/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=taboola
-
https://x.bidswitch.net/sync?dsp_id=156&expires=14&user_id=7e129ca2-929a-4972-a69a-7bd6d2455edc&ssp=taboola
-
https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=af6758d8-ff12-430a-8293-1755c39438f5
-
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=af6758d8-ff12-430a-8293-1755c39438f5&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3Daf6758d8-ff12-430a-82...
|
0
52 B
|
38ms
38ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=af6758d8-ff12-430a-8293-1755c39438f5&tbid=d4ba7c21-c673-4a2c-8405-787a9cda1cc8-tuct485de19&query=taboola_hm%3Daf6758d8-ff12-430a-8293-1755c39438f5
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
collect
www.google-analytics.com/
|
35 B
105 B
|
6ms
6ms
|
Image
image/gif |
2a00:1450:4001:815::200e
Google LLC
|
|
General
- Full URL
- https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=1121615014&t=event&ni=1&_s=12&dl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ul=en-us&de=UTF-8&dt=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEADQ~&jid=&gjid=&cid=626121737.1569478809&tid=UA-204785-4&_gid=882362771.1569478809&cd1=Robert%20Schanze&cd5=2016-09-22T12%3A00%3A41%2B02%3A00&cg1=Howtos%2FTipps&cg2=2857946&cg3=09-2016&cd2=software&cd6=evergreen&cd8=website&cd3=2174540&cd15=website&cd17=not%20logged%20in&cd24=default&cd37=office-business%2C%20private-firmen-finanzen-office-business&cd42=legacy&cm73=1&cm13=1&z=1533584140
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:815::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 |
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
251 B
|
38ms
37ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
55 B
|
38ms
38ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
bid
Show response
c.amazon-adsystem.com/e/dtb/
|
122 B
506 B
|
212ms
211ms
|
XHR
text/javascript |
99.84.157.237
Amazon.com
|
|
General
- Full URL
- https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&pid=9150794382391569478809556&cb=3002186636921569478810130&ws=1600x1200&v=7.36.02&t=1000&slots=%5B%7B%22sd%22%3A%22banner%22%2C%22s%22%3A%5B%22970x250%22%2C%22970x90%22%2C%22800x250%22%2C%22728x90%22%5D%7D%2C%7B%22sd%22%3A%22sky%22%2C%22s%22%3A%5B%22300x600%22%2C%22160x600%22%2C%22200x600%22%2C%22120x600%22%5D%7D%2C%7B%22sd%22%3A%22rectangle%22%2C%22s%22%3A%5B%22300x250%22%5D%7D%5D&pj=%7B%22apse%22%3A%7B%22chunkRequests%22%3Afalse%2C%22shouldCFRoute%22%3Atrue%2C%22shouldSampleLatency%22%3Afalse%7D%7D&cfgv=0&gdprl=%7B%22status%22%3A%22no-cmp%22%7D
- Requested by
- Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
99.84.157.237
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-99-84-157-237.txl52.r.cloudfront.net
- Software
-
Server /
- Resource Hash
- f31bc2708d53b745327c2482a3a23e2f6f854160061ef90a186728ea9728e258
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
54 B
|
38ms
37ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
POST
H2
|
204
|
available
Show response
trc.taboola.com/stroeer-smb-giga/log/3/
|
0
54 B
|
37ms
37ms
|
XHR
image/gif |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
|
254 B
731 B
|
32ms
32ms
|
Image
image/png |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
|
GET
H2
|
200
|
creative_js.js
Show response
vidstat.taboola.com/vpaid/units/14_12_0/creatives/
|
4 KB
2 KB
|
33ms
32ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
f6c853cb-7784-46f4-b5a6-c19affa3bbb3
Show response
t.nativendo.de/cds/tracking/event/
|
0
195 B
|
39ms
37ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame DE0C
|
0
75 B
|
42ms
41ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvgmrfaM_yA7MWwJM-vegNzitSKow5aRjp7ksUUprMsdG-TRs5GunUbd8x674pxuy5x_DHtuarqetbZriB2PV6nicATQsvYaznvYqvQyvjT-3nQc3BxiEUT71cCJmyNVIDbgDUrsVFGdLU3p_dTZD1Kzry-AMH2Gttb7FwnwNNWvoTGxpH7Q-COypkMLbAlwmJFPBPkY_Itn2yrHlqimhymU2bKKG4R2g1O7yi9bTV2xYzbQE9nSJMYlfk2iB2GCD9w725MruRNWOfMsn8&sig=Cg0ArKJSzGwo0HtMn6B4EAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H/1.1
|
200
OK
|
video.php
Show response
media.oadts.com/www/delivery/
Frame DE0C
|
108 KB
108 KB
|
1388ms
29ms
|
Script
text/javascript |
185.22.221.117
WAVECON
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame DE0C
|
78 KB
29 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:81e::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:81e::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
|
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/
Frame 8FB3
Redirect Chain
-
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssfkjtOzUYpFiH9C40ca4MXeqOrYeSQcFuHQkSuFoT-7Z1auMnD0UfIWj-vNFiLuXkkA45DOuu-GhedF7ZHtBvYanLkmf7JoE06KsSTMcHWMYEPULDfPyI4qp2ZMBLD5aKmbpdfcVsQ6...
-
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
|
49 B
343 B
|
151ms
8ms
|
Image
image/gif |
2a02:26f0:6c00:2bc::5f76
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
8 KB
3 KB
|
600ms
600ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4127213489058151&correlator=146968329567255&output=ldjh&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21062724%2C21064503&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C1000x150%7C728x90%7C468x60%7C728x180&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A20918.default%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D17%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26keywords%3D%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26mbrStatus%3Dcalled-idfound%26mbrid%3D400ba9b7a2a0cf36b1673cdc2bd84db6%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65&cookie=ID%3Db470f8ef8539af3e%3AT%3D1569478810%3AS%3DALNI_Ma0FlDrU-o0msNXEPGALQFFeH1CDw&cookie_enabled=1&bc=31&abxe=1&lmt=1569478810&dt=1569478810349&dlt=1569478809258&idt=410&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1797203554&uci=3&ifi=4&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=78&icsg=738940399911424&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&psts=CicIi_-X0RLoAdiy9YmDBIICDN_RiQ3P9sYVr47MFdECriGV_oug59A%2CCicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdEC5_CLIBmh4qM&ga_vid=626121737.1569478809&ga_sid=1569478810&ga_hid=1121615014&fws=128&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.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- ad454629e12d89e1bf371b72b6ca644b35559d049e8ef456a6edfa72cd74b9ec
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
9 KB
4 KB
|
390ms
389ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4127213489058151&correlator=146968329567255&output=ldjh&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21062724%2C21064503&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x40%7C10x30%7C10x20%7C10x22%7C500x600%7C770x200%7C120x600%7C160x600%7C200x600%7C300x600&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A19051.default%26yieldlove_meta%3Dpid%253A19051.sb%253Af%26yieldlove_pid%3D19051%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dsky%26af%3Df1x4%2Cf1x3%2Cf1x2%2Cds%2Csky%2Chpad%2Cband&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D17%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26keywords%3D%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26mbrStatus%3Dcalled-idfound%26mbrid%3D400ba9b7a2a0cf36b1673cdc2bd84db6%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65&cookie=ID%3Db470f8ef8539af3e%3AT%3D1569478810%3AS%3DALNI_Ma0FlDrU-o0msNXEPGALQFFeH1CDw&cookie_enabled=1&bc=31&abxe=1&lmt=1569478810&dt=1569478810356&dlt=1569478809258&idt=410&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1819065434&uci=4&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=78&icsg=738940399911424&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&psts=CicIi_-X0RLoAdiy9YmDBIICDN_RiQ3P9sYVr47MFdECriGV_oug59A%2CCicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdEC5_CLIBmh4qM&ga_vid=626121737.1569478809&ga_sid=1569478810&ga_hid=1121615014&fws=128&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.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 184bdd64f0ca4a2db46920675970e8467081418a88bb1501e9c5dcf211a0d05e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
|
7 KB
3 KB
|
776ms
776ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=4127213489058151&correlator=146968329567255&output=ldjh&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21062724%2C21064503&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=4444%2Fgiga.de_sd%2Fsoftware_artikel&sz=10x20%7C10x10%7C300x250&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reloaded%3Dfalse%26yieldlove_scenario%3Ddefault%26yieldlove_scenario_pid%3Dpid%253A9501.default%26yieldlove_meta%3Dpid%253A9501.sb%253Af%26yieldlove_pid%3D9501%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Drectangle%26af%3Df1x2%2Cf1x1%2Cmrec&eri=1&cust_params=tagm%3Dmt%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dsoftware%26smb-platform%3D%26smb-content%3DHowtos%252FTipps%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D17%26smb-hour%3D8%26yt%3D0%26adset%3Dbrsl%26keywords%3D%26nuggad%3Dn2-3%252Cn3-1%252Cn4-3%252Cn5-3%252Cn6-2%252Cn7-1%252Cn8-1%252Cn9-3%252Cn10-2%252Cn11-1%252Cn12-1%252Cn17-4%252Cn18-2%252Cn20-2%252Cn21-4%252Cn22-4%252Cn39-4%252Cn43-4%252Cn44-3%252Cn46-4%252Cn47-4%252Cn48-4%252Cn55-4%252Cn57-4%252Cn60-3%252Cn67-1%252Cn75-0%252Cn76-1%252Cn77-0%252Cn78-0%252Cn79-1%252Cn80-0%252Cn81-0%252Cn82-0%252Cn83-0%252Cn84-0%252Cn85-0%252Cn86-0%252Cn87-0%252Cn88-1%252Cn117-4%252Cn118-3%252Cn119-6%252Cn120-2%252Cn121-1%252Cn122-1%252Cn123-2%252Cn127-0%252Cn128-1%252Cn133-1%252Cn95-1%252Cn96-1%252Cn135-9%252Cn15-1%252Cn66-1%252Cn89-1%252Cn90-1%252Cn91-1%252Cn92-3%252Cn93-4%252Cn94-2%252Cn97-1%252Cn98-1%252Cn101-1%252Cn104-1%252Cn106-1%252Cn108-1%252Cn114-1%252Cn115-1%252Cn124-1%252Cn125-1%252Cn126-1%252Cn139-1%252Cn148-1%252Cn149-1%252Cn154-1%252Cn155-1%252Cn156-1%252Cn158-1%252Cn159-1%252Cn161-1%26mbrStatus%3Dcalled-idfound%26mbrid%3D400ba9b7a2a0cf36b1673cdc2bd84db6%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65&cookie=ID%3Db470f8ef8539af3e%3AT%3D1569478810%3AS%3DALNI_Ma0FlDrU-o0msNXEPGALQFFeH1CDw&cookie_enabled=1&bc=31&abxe=1&lmt=1569478810&dt=1569478810364&dlt=1569478809258&idt=410&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3179048887&uci=5&ifi=6&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dssz=78&icsg=738940399911424&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&psts=CicIi_-X0RLoAdiy9YmDBIICDN_RiQ3P9sYVr47MFdECriGV_oug59A%2CCicIxKKv2RDoAfyQ0vKCBIICDN_RiQ3P9sYVr47MFdEC5_CLIBmh4qM&ga_vid=626121737.1569478809&ga_sid=1569478810&ga_hid=1121615014&fws=128&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.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- d7ffe79e05595ebf151f9b9558e13b65748b50c596b098a9a135596213fe3d9e
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
st
imprammp.taboola.com/
Frame D1C4
|
0
0
|
41ms
40ms
|
Document
text/html |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=DE872DE711311522711065455424&cicmp=1657475&cijs=1&dast=V7-dACFgOW6IPyNq4Z0gSW6IPyNq4Z0gUAAAAGBvQHG8Qi7iYjFm-x2CwWq8lkN1jsFovZbDQaTSHEWC6TQS2QsMx-30FBOT09ZpdBxnKZDGqBrGly-d3whabT4XPd63W_313n9DnsIpdf97I4DIfPX_BwHh5mv-hpOHz-gofz8DC7xX6f0-7W_N06l9H0eavuJrfm7xb7XZ7TW2m0vMV-n9PuFlz-FrPL7fLLAQAAAOABQKmwH-IHEAAgAgAAAEACAAAAgCKg4t9C4AIAAAAAA6AA60cDgJIjIdye08tycrj9AQDwEAACADCgQAIwgNNUAlCRc3ACAAAAAAAAAMDy____HwOgR3wmA5ChNHhj0APw4APwIAQAAJA1JOyjJY-RK55KVIBYxAgAAAAgywSs92hSJ1QWVQAABOlWAFcAAAFtbDoZ_lm6gxJvYQAAAARjC_Sw-P1mh13jd7sMAAAAAAAAAMDs_-wfTShqMCwNiLOfXu0XEABg7RcQAIBN3QAA3gLggs4Al6vlbrE6g5hsRrvJ7AAAAADu_v____VAyuJZ7CYem8s2GdkGi5nDZlrsVs7BxOFaGBcO2_bUEI7JVqRjc_tGhGX2-w4KyunpMbsMMpbLZFALZE2Ty28QHzQMy8kgmN-ELUaryWSzHM6Wi8lgOBqORvsTuNEAJ2g4HCx2g8VusRhOFpPRYDlYoEAMJjghw9FmshrtVrvJcjgZjWabyQYpWrWajTaD4Wo2me12q-FguByNkKI1i9lkspiNlrvNYDkZDYaT4RBhyDRx-DaWxVpj223WooVl4xaOBqu1brhbODcmh2PjMa5Fr4_pNFyNXI7lFgUDqvYiuEgnmtPl73JZ3pq3xa1z-hwWsURzskgnssu-ZfEsdhOPzWWbjGyDxcxhMy12K-dg4nAtjAuHbV8yTRy-jWWx1th2m7VoYdm4haPBaq0b7hbOjcnh2HiMa9HrYzoNVyOXY7lvrGbL0W44HCz3jdVsOdoNh4PlvkNn-K4-Z6PyplV4XMbxtifyypwGhctg8f6OFmns1psZVbaxxWJaqMfTo9_v9_v9fr_f7_cbtJ6D2WBQxBLB6SKdiF7G00UskTwt0olwthssZy7XaLnZzSYbi8U4GSyHC-doMFqtBqPZRCxRmi7SiV73sjgMh89f8HAeHma_6Gk4fP6Ch_PwMLvFfp_T7tb83TqX0fR5q-4mt-bvFvtdntNbabS8xX6f0-4WXP4Ws8vtsqj_yIDLuWY4V87miuFylQAAAAAAAAAAljBn3gQAAADgNJDFYjBZLBcAQox1l-BTKuTRCfytuPFjiDld_i6X5a15W9w6p89hZQCJnQI!&excid=22&tst=1&docw=0
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
|
GET
H2
|
200
|
cmTagFEED_MANAGER.js
Show response
vidstat.taboola.com/vpaid/units/23_14_1/infra/
|
762 KB
179 KB
|
30ms
29ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
cmOsUnit.css
vidstat.taboola.com/vpaid/units/23_14_1/assets/css/
|
34 KB
6 KB
|
33ms
32ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 0AD8
|
0
57 B
|
36ms
36ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssqD3U9TH7YnqzNuXbhOKCNjk18vJvdliGERhRgy5Y3aw0XhVcqLKtyz8tgjb1h6nO_rrOb5c8jZjukPkiJ_KYiWlUN5A9NDQPW0Va8QN7Q2cFXU3ZLBaTwAU1GGg2G6A2ITXIEy0XG5sPcMtEwCrVK3YLSEAMjSdepXEn70BSe7N3lhlM6ZbR8UsLQqGjgrCDhqyo5aaso90tgSKXh8fd5Qd0EnatyhDOjymoSFSKkboqSfz2g84qnWF2R0BkFeP1fYc6avB1aiQ&sig=Cg0ArKJSzNb8RyLmJbBKEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame 0AD8
|
44 KB
14 KB
|
14ms
14ms
|
Script
text/javascript |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/tag/js/gpt.js
- 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:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8f34bd63743779956176a9fe36dba32cd8c0b31b86d25266024cc4767e89ca0f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 0AD8
|
78 KB
29 KB
|
15ms
15ms
|
Script
text/javascript |
2a00:1450:4001:81e::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:81e::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
H/1.1
|
204
No Content
|
b2
sb.scorecardresearch.com/
Redirect Chain
-
https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1569478810767&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps...
-
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1569478810767&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapp...
|
0
248 B
|
29ms
29ms
|
Image
text/plain |
2.19.43.224
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1569478810767&ns_c=UTF-8&cv=3.1e&c8=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&c7=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&c9=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.19.43.224
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-43-224.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 0AD8
|
156 KB
57 KB
|
62ms
62ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 0AD8
|
113 B
178 B
|
15ms
15ms
|
Script
application/javascript |
2a00:1450:4001:81a::2002
Google LLC
|
|
|
GET
H2
|
200
|
ads
Show response
securepubads.g.doubleclick.net/gampad/
Frame 0AD8
|
21 KB
8 KB
|
338ms
337ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2313926311236453&correlator=1045949495001092&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&eid=21064550&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-300x600&sz=120x600%7C160x600%7C300x600&eri=6&cookie=ID%3Db470f8ef8539af3e%3AT%3D1569478810%3AS%3DALNI_Ma0FlDrU-o0msNXEPGALQFFeH1CDw&cdm=www.giga.de&bc=31&lmt=1569478810&dt=1569478810881&dlt=1569478810755&idt=122&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=600&oid=3&adx=1318&ady=121&adk=2714360146&uci=yva24jinj484&ifi=1&ifk=2690342359&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=9&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x600&msz=300x600&ga_vid=626121737.1569478809&ga_sid=1569478811&ga_hid=1316502438&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.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 8bd4efff5c1859771e1b44207e079690c85809e7cb0c9870c1e5754d4ba7a560
- 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 0AD8
|
62 KB
24 KB
|
60ms
59ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 0AD8
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::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:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 0AD8
|
212 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
container
Show response
tracking.m6r.eu/pixel/
|
3 KB
2 KB
|
49ms
48ms
|
Script
text/javascript |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n2=3&n3=1&n4=3&n5=3&n6=2&n7=1&n8=1&n9=3&n10=2&n11=1&n12=1&n17=4&n18=2&n20=2&n21=4&n22=4&n39=4&n43=4&n44=3&n46=4&n47=4&n48=4&n55=4&n57=4&n60=3&n67=1&n75=0&n76=1&n77=0&n78=0&n79=1&n80=0&n81=0&n82=0&n83=0&n84=0&n85=0&n86=0&n87=0&n88=1&n117=4&n118=3&n119=6&n120=2&n121=1&n122=1&n123=2&n127=0&n128=1&n133=1&n95=1&n96=1&n135=9&n15=1&n66=1&n89=1&n90=1&n91=1&n92=3&n93=4&n94=2&n97=1&n98=1&n101=1&n104=1&n106=1&n108=1&n114=1&n115=1&n124=1&n125=1&n126=1&n139=1&n148=1&n149=1&n154=1&n155=1&n156=1&n158=1&n159=1&n161=1
- Requested by
- Host: cdn.m6r.eu
URL: https://cdn.m6r.eu/sync/api
- 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
- fb24a382e9e8b17c4b5c5458171bd6766b725ee540e3e189a171876fa68fd9a2
|
GET
H/1.1
|
200
OK
|
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=400ba9b7a2a0cf36b1673cdc2bd84db6&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D400ba9b7a2a0cf36b1673cdc2bd84db6%2...
-
https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=400ba9b7a2a0cf36b1673cdc2bd84db6&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3D400ba9b7a2a0cf36b1673cdc2bd84db6%2...
-
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=400ba9b7a2a0cf36b1673cdc2bd84db6&userId=adscale-user:a0986f751aac48078021c34d09ba90fa
|
44 B
528 B
|
52ms
52ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H2
|
200
|
rum.js
Show response
securepubads.g.doubleclick.net/pagead/js/
Frame 0AD8
|
49 KB
19 KB
|
24ms
24ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 96D5
|
0
57 B
|
37ms
36ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjssCEyj7SS1jo_mkcIC1vgX6u_UPpn4bMmjp94no1kaMzmqd_gNG3OH_xInB_Ce3AXIjwkNneuHJ95QNdTVSfbFT5npp3_ylK9IQwbk7D-WWLbcbJ2_QIVdQJj_QNlaxlu3ZgPAF0-VPYKULn4J07pMYaTDNSdxW2QV9Y0aCbEns8YnxD3MBfJROTtUMKAERhAbK1iuF1E6i3BW-0BnrePUjomSXjhO5H5ZwLWcY5relfxK47BhtU0LJhp9AB0X5aW7kofZlS9ER_aRI6ihlhnmrGkDBwUvYGg&sig=Cg0ArKJSzFV2M3npfIlTEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
adtrust-min.php
Show response
www.ad4mat.de/ads/js/
Frame 96D5
|
19 KB
6 KB
|
1583ms
31ms
|
Script
text/javascript |
146.148.127.183
Google LLC
|
|
General
- Full URL
- https://www.ad4mat.de/ads/js/adtrust-min.php?cat=bild_bildbanner&w=728&h=90&zanox_tracking_host=https://ad.zanox.com/ppc/&zanox_tracking_param=45653274C322971660&adclick=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsuZWb01NLqA8S7bypB5pNh53u3WERTrJCCGSzsdqH_mwsLl7XxzJ6CxKyeZ_zqN1tre6UsEi4Z2XuD1Rc2hOd0cy_U79MyXX_3Kddrz5WkBF8DR1RrciQdTYioqhxcoWCKrbwMU0BPw5viZyBrRJ2MlDTDW8Y8HlGSjEwKmRC2GghP7p0Txujiek5oNAnpWCP7dBB5ueSRt01M5TDAHcs303aSD5XV0_BJhRDuKnDcUtk1FJ0on6f6R8A6qzGKtW3upykbyppkBR6Y%2526sig%253DCg0ArKJSzDvoJwbvkycCEAE%2526urlfix%253D1%2526adurl%253D
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019091901.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
146.148.127.183
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 183.127.148.146.bc.googleusercontent.com
- Software
-
nginx /
- Resource Hash
- 7d50ac76906ab56e6776bc4720232b4b7c049b9c1087335c1f577520d716d0db
|
GET
H/1.1
|
200
OK
|
onepixel.gif
ad.zanox.com/ppv/images/
Frame 96D5
Redirect Chain
-
https://ad.zanox.com/ppv/?45653274C322971660
-
https://ad.zanox.com/ppv/images/onepixel.gif
|
43 B
460 B
|
96ms
32ms
|
Image
image/gif |
195.216.249.67
ZANOX
|
|
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 96D5
|
78 KB
29 KB
|
13ms
13ms
|
Script
text/javascript |
2a00:1450:4001:81e::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:81e::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
H/1.1
|
200
OK
|
wrap.js
Show response
confiant-integrations.global.ssl.fastly.net/prebid/201909241602/
|
25 KB
10 KB
|
26ms
26ms
|
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/2DPge-WVhZFIVEVo0laRH9eF5JI/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
|
POST
H2
|
204
|
csi
csi.gstatic.com/
Frame 0AD8
|
0
56 B
|
67ms
66ms
|
Other
image/gif |
2a00:1450:4017:805::2003
Google LLC
|
|
General
- Full URL
- https://csi.gstatic.com/csi?v=2&s=pagead&action=csi_pagead&dmc=8&puid=1~k10b5t2k&chm=1&ctx=2&gqid=mliMXb6aF8OCgQfO_4mIAg&qqid=CN2L55fs7eQCFYc44AodMwgC8w&met.4=fb.2~lb.3s~ol.5h~idt.b~dt.-b3&met.9=1.l~2.3e&met.3=197.3s~123.3s_1~118.3t~118.3u~118.4d~118.4e~117.5h~118.5l~118.5n~118.5v~113.6h_2~112.6h_3&met.1=1.k10b5sw3~14.0~15.0~16.0~17.0~18.0~19.0~20.5g~21.5h~22.41~23.41&met.7=CCIQBBgBIAIoAjAnOCVoA3AneDmwAQG4AQM~CA0QChgBIAIoAjAROA9oA3AReI5wgAGeb4gB7NwCsAEBuAED~CCoQChgBIAIoAjAUOBI~CA4QChgBIBYoFjB2OGBoFnBUeLrKA4AByMkDiAGT4wmwAQG4AQM~CDAQBxgBIBYoFjAlOA9oFnAleLIBgAFsiAFxsAEBuAED~CCwQChgBIIMBKIMBMMIBOD9ogwFwvwF4pb0BgAHXvAGIAf3wA7ABAbgBAw~CCgQChgBIMsBKMsBMOYBOBtoywFw5AF4q5UBgAHhlAGIAd6FA7ABAbgBAw
- Requested by
- Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/pagead/js/rum.js
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4017:805::2003
, Ireland,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
Golfe2 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H/1.1
|
200
OK
|
userconnect.js
Show response
js.adscale.de/
|
13 KB
5 KB
|
84ms
27ms
|
Script
text/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
f6c853cb-7784-46f4-b5a6-c19affa3bbb3
Show response
t.nativendo.de/cds/tracking/event/
|
0
193 B
|
33ms
33ms
|
Script
text/javascript |
107.178.241.34
Google LLC
|
|
General
- Full URL
- https://t.nativendo.de/cds/tracking/event/f6c853cb-7784-46f4-b5a6-c19affa3bbb3?aid=182yo&floor=ZjZjODUzY2ItNzc4NC00NpkUGw2J5_wSprh9Hg&cpm=&dsp=1&t[0]=rtb%2Fauction&t[1]=rtb%2Frequest&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ts=1569478811
- 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.2,
ECDHE_RSA, AES_128_GCM
- Server
-
107.178.241.34
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 34.241.178.107.bc.googleusercontent.com
- Software
-
Apache /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
view
Show response
securepubads.g.doubleclick.net/pcs/
Frame 61C4
|
0
57 B
|
38ms
35ms
|
Fetch
image/gif |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstSXqRgCcGMFl2VYI5k_Hju3smQPjgN0GSJQb_F40qb541MXhvrxmd3C3Y9lVVkvN9tYmc3T1_6WtjSOt48X6Lm_psrDLn4SSIhwFUXETFBXiVztsy35caJE69qP_1aNFnXjzzPAPu7Th39a_9c0CbbkpY4ze4SmeoTuMpE5791xKbiw9F28BNZJcWj_ztFOuTUF0FwJsWjX3pBMlAVsBjctIWzrPYIu_KqZmEciEKVrFAssel8KyRycRk57d_F0NlpbPxkMSswIaA&sig=Cg0ArKJSzFTUPzT5UN2SEAE&urlfix=1&adurl=
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
172.217.16.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
gpt.js
Show response
www.googletagservices.com/tag/js/
Frame 61C4
|
44 KB
14 KB
|
17ms
15ms
|
Script
text/javascript |
2a00:1450:4001:81e::2002
Google LLC
|
|
General
- Full URL
- https://www.googletagservices.com/tag/js/gpt.js
- 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:81e::2002
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
sffe /
- Resource Hash
- 8f34bd63743779956176a9fe36dba32cd8c0b31b86d25266024cc4767e89ca0f
- Security Headers
-
Name |
Value |
X-Content-Type-Options |
nosniff |
X-Xss-Protection |
0 |
|
GET
H2
|
200
|
osd_listener.js
Show response
www.googletagservices.com/activeview/js/current/
Frame 61C4
|
78 KB
29 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:81e::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:81e::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
H/1.1
|
200
OK
|
userconnect
Show response
ih.adscale.de/
|
546 B
928 B
|
963ms
47ms
|
Script
application/javascript |
2.18.234.72
Akamai Technologies
|
|
|
GET
H2
|
200
|
pubads_impl_2019091901.js
Show response
securepubads.g.doubleclick.net/gpt/
Frame 61C4
|
156 KB
57 KB
|
60ms
59ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
integrator.sync.js
Show response
adservice.google.de/adsid/
Frame 61C4
|
113 B
175 B
|
15ms
14ms
|
Script
application/javascript |
2a00:1450:4001:81a::2002
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 5D87
|
0
0
|
6ms
5ms
|
Document
text/html |
2a00:1450:4001:81e::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:81e::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 0AD8
|
77 KB
29 KB
|
20ms
20ms
|
Script
text/javascript |
2a00:1450:4001:81e::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:81e::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/
Frame 61C4
|
21 KB
8 KB
|
412ms
412ms
|
XHR
text/plain |
172.217.16.162
Google LLC
|
|
General
- Full URL
- https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2751854054235126&correlator=1288935098639423&output=ldjh&callback=googletag.impl.pubads.callbackProxy1&impl=fif&vrg=2019091901&guci=1.2.0.0.2.2.0.0&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504&sc=1&sfv=1-0-35&ecs=20190926&iu=%2F5286166%2Fgiga.de%2FDFP-Passback-300x250&sz=300x250&eri=6&cookie=ID%3Db470f8ef8539af3e%3AT%3D1569478810%3AS%3DALNI_Ma0FlDrU-o0msNXEPGALQFFeH1CDw&cdm=www.giga.de&bc=31&abxe=1&lmt=1569478811&dt=1569478811280&dlt=1569478811154&idt=122&ea=0&frm=23&biw=1585&bih=1185&isw=300&ish=250&oid=3&adx=968&ady=278&adk=3816689529&uci=qielpm49ma2d&ifi=1&ifk=1431988673&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.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&top=www.giga.de&dssz=7&icsg=10&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&ga_vid=626121737.1569478809&ga_sid=1569478811&ga_hid=1240908032&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.162
, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- fra15s11-in-f2.1e100.net
- Software
-
cafe /
- Resource Hash
- 510f21a20420e5f7db0b8a8e230ea6fee88fc51f4d73c515897c4b0ae18f7099
- 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 61C4
|
62 KB
24 KB
|
64ms
64ms
|
Script
text/javascript |
172.217.16.162
Google LLC
|
|
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 61C4
|
0
0
|
6ms
5ms
|
Other
text/html |
2a00:1450:4001:81e::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:81e::2001
Frankfurt am Main, Germany,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- Software
-
/
- Resource Hash
|
GET
DATA
|
200
OK
|
truncated
/
Frame 61C4
|
216 B
0
|
|
Image
image/png |
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
35ms
34ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/gwzmDWbAAKktFLkqFFlqwF23A52AwwA/k0F/DmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B03A21A54Az1A51AmjEpkF9xAz4Ay0AxzA5zA25A5mAzpF6lF9zAwwA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B03A21A54Az1A51AmhEwkF90A32A15A4zA15A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A03A44AxwA51AyBELlnFBUkzFnBPwUAAAAAAABsxvAPBAAFAAsxvTYeNAPAAAmUA5BABYeNAZBAAOA55A55A85B55A58E55A55AGAx5A12A5yArYeNAP0CAmUA5BAHYeNASksFGFjAAAAAAAAAAAAEAAAsxvAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4E2wAwBEMAxzA4yA0xAz5Az2A55AGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A21A54Az1A51ADAzrF5BFKA03A21A54Az1A51AKA03A21A54Az1A51AtAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5BFdmUA5BAsEAYJAFAAAYeNAAAAAKAIhFsmFwhFnlFBkFAAAAAAAAAAAAAAAAQtjFLsb+TA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H2
|
200
|
container.html
tpc.googlesyndication.com/safeframe/1-0-35/html/
Frame 1B5D
|
0
0
|
8ms
6ms
|
Document
text/html |
2a00:1450:4001:81e::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:81e::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 61C4
|
77 KB
29 KB
|
15ms
14ms
|
Script
text/javascript |
2a00:1450:4001:81e::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:81e::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
H/1.1
|
200
OK
|
4765983595
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
47 B
297 B
|
87ms
28ms
|
XHR
application/json |
18.196.191.159
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame DE0C
|
43 B
424 B
|
28ms
28ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame DE0C
|
43 B
424 B
|
90ms
28ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame DE0C
|
43 B
424 B
|
119ms
31ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
avc.php
Show response
media.oadts.com/www/delivery/
Frame DE0C
|
12 KB
12 KB
|
57ms
32ms
|
XHR
application/json |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg8647594772&startmuted=1&cb=0.9414807778256089&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&autostart=1
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- d9dd0da651eb3a9dde8b87a218222d1189f7470c6b481c71c97a13f901d09a30
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame DE0C
|
43 B
424 B
|
114ms
28ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame DE0C
|
1 KB
1 KB
|
184ms
49ms
|
XHR
text/xml |
62.168.44.125
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=41c6899a5b&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.125
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
ibillboard /
- Resource Hash
- 2d0bee0da9b26d78da78028a4d55c62039c60a4b09e88e247f57c05196af1c1c
|
GET
H/1.1
|
200
OK
|
le.php
media.oadts.com/www/delivery/
Frame DE0C
|
43 B
307 B
|
56ms
28ms
|
Image
image/gif |
185.22.221.117
WAVECON
|
|
General
- Full URL
- https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=23481&eventId=21&plr=3&cb=0.1861925295596636&loc=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2Fhttps%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&dur=0
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, CHACHA20_POLY1305
- Server
-
185.22.221.117
, Germany,
ASN60955
(WAVECON, DE),
- Reverse DNS
- wv-gw1.wavecloud.de
- Software
-
lighttpd/1.4.45 /
- Resource Hash
- 4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 0AD8
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstpyQzSk2nQ2PdYs0UUYoq9bkuGDsM7du79EBacvpSNrX5sIvqAd5p778oJGIvyMROj-hE_yBMzMPumculYRHY7-C8WKiqt2aHRITWLiaM&sig=Cg0ArKJSzEiUw_goCFTfEAE&adk=1819065434&tt=-1&bs=1585%2C1185&mtos=0,1052,1052,1052,1052&tos=0,1052,0,0,0&p=121,1318,721,1618&mcvt=1052&rs=3&ht=0&tfs=1317&tls=2369&mc=0.89<e=0.89&bas=0&bac=0&met=no&avms=nio&niot_obs=1165&niot_cbk=1173&md=2&lm=2&rst=1569478810757&rpt=134&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1618%2C5992&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-29-24-14-125-22-0-0-0&tvt=2361&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.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::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
|
vast
Show response
tracking.m6r.eu/sync/
Frame DE0C
|
490 B
926 B
|
81ms
80ms
|
XHR
text/xml |
104.109.82.87
AKAMAI-ASN1
|
|
General
- Full URL
- https://tracking.m6r.eu/sync/vast?checkcookies=true&ibbId=&slotId=346a3f1b-2167-4e54-8af3-4a8d2910a189&target=https%3A%2F%2Fvideo-adserver.ibillboard.com%2FgetAd%3Ftagid%3D346a3f1b-2167-4e54-8af3-4a8d2910a189%26bust%3D41c6899a5b%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fwebapps%252Fpaypal%252Ftipps%252Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D77121583-b7e3-4b14-bc88-30bd61aa68f9
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- 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
- 3ad0d462a86bf20b6167f5060eccc7a58768e6a5baf26a98f5db74c4dfba3ed1
|
GET
H/1.1
|
200
OK
|
Cookie set
map
ih.adscale.de/
Frame B95B
|
0
0
|
105ms
104ms
|
Document
text/html |
2.18.234.72
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
nuggad
ih.adscale.de/
Frame 0CAA
Redirect Chain
-
https://adscale.nuggad.net/bk?nuggn=1660240041&nuggsid=1029839715&nuggrid=http%3A%2F%2Fwww.giga.de&nuggl=https%3A%2F%2Fih.adscale.de%2Fnuggad%3F%2Fnu%2F0%2Fpre%2F0%2Fsid%2FYmJiY2Mw%2Fuu%2F3439fdd84...
-
https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/3439fdd8402e4bd29644faee5e9ca6c4/ts/1569478812117/v/2/hid/409/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-s...
|
49 B
491 B
|
41ms
40ms
|
Image
image/gif |
2.18.234.72
Akamai Technologies
|
|
General
- Full URL
- https://ih.adscale.de/nuggad?/nu/0/pre/0/sid/YmJiY2Mw/uu/3439fdd8402e4bd29644faee5e9ca6c4/ts/1569478812117/v/2/hid/409/ssl/1/ws/https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F/nvars/d1=1&d9=1&d8=2&d7=1&d2=1&d12=2&d11=3&d4=1&c5=9&c6=9&c7=9&c8=9&d3=3&d10=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.234.72
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-234-72.deploy.static.akamaitechnologies.com
- Software
-
Apache-Coyote/1.1 /
- Resource Hash
- 68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
|
GET
H/1.1
|
200
OK
|
getAd
Show response
video-adserver.ibillboard.com/
Frame DE0C
|
48 B
567 B
|
185ms
184ms
|
XHR
text/xml |
62.168.44.125
GTSCE GTS Central...
|
|
General
- Full URL
- https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=41c6899a5b&ref=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=77121583-b7e3-4b14-bc88-30bd61aa68f9
- Requested by
- Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.125
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- host-125.billboard.cz
- Software
-
ibillboard /
- Resource Hash
- c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
|
GET
H/1.1
|
200
OK
|
pixel
tracking.m6r.eu/consent/
|
44 B
209 B
|
48ms
48ms
|
Image
image/gif |
104.109.82.87
AKAMAI-ASN1
|
|
|
GET
H/1.1
|
200
OK
|
moY
tracker-adserver.ibillboard.com/error/impid/77121583-b7e3-4b14-bc88-30bd61aa68f9/iid/38ed8662-73d0-44fe-984c-b4f475f7f411/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2...
Frame DE0C
|
0
272 B
|
183ms
43ms
|
Image
text/plain |
62.168.44.126
GTSCE GTS Central...
|
|
General
- Full URL
- https://tracker-adserver.ibillboard.com/error/impid/77121583-b7e3-4b14-bc88-30bd61aa68f9/iid/38ed8662-73d0-44fe-984c-b4f475f7f411/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/moY?erc=303
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
62.168.44.126
Velke Prilepy, Czech Republic,
ASN5588
(GTSCE GTS Central Europe / Antel Germany, CZ),
- Reverse DNS
- bbnaut2.bbelements.com
- Software
-
ibillboard /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
tag
Show response
a.teads.tv/page/68592/
Frame DE0C
|
1 KB
827 B
|
32ms
31ms
|
Script
application/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 61C4
|
42 B
110 B
|
15ms
14ms
|
Image
image/gif |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsthjYkXEUWjPrpmbFSJgDPk_TlEJmcx-PyyazOZIS_6m5X2GP1kqm7-cNGcvdtbNwab5d1yiBx6LHG52S8eAWH41dVfvOUCzkgPyuFqRIo&sig=Cg0ArKJSzLjbWMm9E-0aEAE&adk=3179048887&tt=-1&bs=1585%2C1185&mtos=1064,1064,1064,1064,1064&tos=1064,0,0,0,0&p=278,968,528,1268&iza=1&mcvt=1064&rs=3&ht=0&tfs=1733&tls=2797&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=1575&niot_cbk=1583&md=2&lm=2&rst=1569478811166&rpt=123&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1618%2C5992&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-44-28-14-153-26-0-0-0&tvt=2793&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.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::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
|
teads-format.min.js
Show response
a.teads.tv/media/format/v3/
|
712 KB
186 KB
|
30ms
29ms
|
Script
text/javascript |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame F563
|
0
0
|
17ms
6ms
|
Document
text/html |
2a02:26f0:6c00:292::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- 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_256_GCM
- Server
-
2a02:26f0:6c00:292::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
index.html
cmp.teads.mgr.consensu.org/
Frame CC62
|
0
0
|
15ms
8ms
|
Document
text/html |
2a02:26f0:6c00:292::2c92
AKAMAI-ASN1
|
|
General
- Full URL
- https://cmp.teads.mgr.consensu.org/index.html
- 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_256_GCM
- Server
-
2a02:26f0:6c00:292::2c92
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
|
GET
H/1.1
|
200
OK
|
p
sb.scorecardresearch.com/
|
43 B
309 B
|
35ms
33ms
|
Image
image/gif |
2.19.43.224
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569478812564&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=46739565&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.19.43.224
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-43-224.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
111ms
109ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
112ms
110ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
p
sb.scorecardresearch.com/
|
43 B
309 B
|
64ms
29ms
|
Image
image/gif |
2.19.43.224
AKAMAI-ASN1
|
|
General
- Full URL
- https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1569478812579&ns_st_ec=1&ns_st_cn=1&ns_st_ev=play&ns_st_ct=va00&ns_st_cl=0&ns_st_pt=0&c3=*null&c4=*null&c6=*null&ns_ts=29044241&cs_ucfr=1
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.19.43.224
, Ascension Island,
ASN20940
(AKAMAI-ASN1, US),
- Reverse DNS
- a2-19-43-224.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- 24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
112ms
110ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
111ms
110ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
103ms
103ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=db8d1bd5-0395-470c-a920-c38cd094a5e8&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=119
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
H2
|
200
|
ad
Show response
a.teads.tv/page/68592/
|
118 B
332 B
|
159ms
159ms
|
XHR
application/json |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://a.teads.tv/page/68592/ad?windowWidth=1600&windowHeight=1200&windowDepth=1&windowReferrerUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=db8d1bd5-0395-470c-a920-c38cd094a5e8&formatVersion=2.22.61&env=js-web&netBw=10&ttfb=119
- Requested by
- Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
/
- Resource Hash
- f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
|
GET
DATA
|
200
OK
|
truncated
/
Frame 96D5
|
208 B
0
|
|
Image
image/png |
|
|
|
GET
H2
|
200
|
conbanner_bild1.php
www.ad4mat.de/ads/
Frame 76EF
|
0
0
|
717ms
717ms
|
Document
text/html |
146.148.127.183
Google LLC
|
|
General
- Full URL
- https://www.ad4mat.de/ads/conbanner_bild1.php?cat=bild_bildbanner&w=728&h=90&zanox_tracking_host=https://ad.zanox.com/ppc/&zanox_tracking_param=45653274C322971660&adclick=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsuZWb01NLqA8S7bypB5pNh53u3WERTrJCCGSzsdqH_mwsLl7XxzJ6CxKyeZ_zqN1tre6UsEi4Z2XuD1Rc2hOd0cy_U79MyXX_3Kddrz5WkBF8DR1RrciQdTYioqhxcoWCKrbwMU0BPw5viZyBrRJ2MlDTDW8Y8HlGSjEwKmRC2GghP7p0Txujiek5oNAnpWCP7dBB5ueSRt01M5TDAHcs303aSD5XV0_BJhRDuKnDcUtk1FJ0on6f6R8A6qzGKtW3upykbyppkBR6Y%2526sig%253DCg0ArKJSzDvoJwbvkycCEAE%2526urlfix%253D1%2526adurl%253D&refAd=www.giga.de
- Requested by
- Host: www.ad4mat.de
URL: https://www.ad4mat.de/ads/js/adtrust-min.php?cat=bild_bildbanner&w=728&h=90&zanox_tracking_host=https://ad.zanox.com/ppc/&zanox_tracking_param=45653274C322971660&adclick=https://adclick.g.doubleclick.net/pcs/click%253Fxai%253DAKAOjsuZWb01NLqA8S7bypB5pNh53u3WERTrJCCGSzsdqH_mwsLl7XxzJ6CxKyeZ_zqN1tre6UsEi4Z2XuD1Rc2hOd0cy_U79MyXX_3Kddrz5WkBF8DR1RrciQdTYioqhxcoWCKrbwMU0BPw5viZyBrRJ2MlDTDW8Y8HlGSjEwKmRC2GghP7p0Txujiek5oNAnpWCP7dBB5ueSRt01M5TDAHcs303aSD5XV0_BJhRDuKnDcUtk1FJ0on6f6R8A6qzGKtW3upykbyppkBR6Y%2526sig%253DCg0ArKJSzDvoJwbvkycCEAE%2526urlfix%253D1%2526adurl%253D
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
146.148.127.183
Mountain View, United States,
ASN15169
(GOOGLE - Google LLC, US),
- Reverse DNS
- 183.127.148.146.bc.googleusercontent.com
- Software
-
nginx /
- Resource Hash
|
GET
H2
|
200
|
iframe
sync.teads.tv/
Frame 8958
|
0
0
|
71ms
71ms
|
Document
text/html |
2.18.232.7
Akamai Technologies
|
|
General
- Full URL
- https://sync.teads.tv/iframe?pid=73584&userId=db8d1bd5-0395-470c-a920-c38cd094a5e8&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&env=js-web&1569478812719
- 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.2,
ECDHE_RSA, AES_256_GCM
- Server
-
2.18.232.7
, Ascension Island,
ASN16625
(AKAMAI-AS - Akamai Technologies, Inc., US),
- Reverse DNS
- a2-18-232-7.deploy.static.akamaitechnologies.com
- Software
-
akka-http/10.1.5 /
- Resource Hash
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
68ms
68ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H2
|
200
|
track
t.teads.tv/
|
23 B
157 B
|
79ms
79ms
|
Image
image/gif |
2.18.232.7
Akamai Technologies
|
|
|
GET
H/1.1
|
200
OK
|
5158542952
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
44 B
294 B
|
91ms
30ms
|
XHR
application/json |
18.196.191.159
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
hd-main.js
Show response
hgc-cf-cache-1.svonm.com/
Frame 4650
|
203 KB
59 KB
|
39ms
38ms
|
XHR
application/javascript |
52.84.163.227
Amazon.com
|
|
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame 4650
|
203 KB
0
|
|
Script
text/javascript |
|
|
|
GET
H/1.1
|
200
OK
|
global_config.json
Show response
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/
Frame 4650
|
53 B
642 B
|
35ms
33ms
|
XHR
application/json |
52.219.73.88
Amazon.com
|
|
General
- Full URL
- https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=5290018772
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGNlaVF1YWVmaGFpQnV4YWU9Y2VpUXVhZWZoYWlCdXhhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5aYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5zbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5hZCxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlJhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuYmYoYyk7YS5qdShsKTthLml1KG0pO2EuVXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkliLmxlbmd0aCl7dmFyIGE9bC5JYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG49dGhpcy5hWzZdO3RoaXMuTHA9dGhpcy5hWzZdO3RoaXMueG09dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5IcD1iO2IucHJvdG90eXBlPXtDbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG46dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSHB8fGhhLHJjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zbz0hMTt0aGlzLlhiPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQXQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLk5nPXt9O3RoaXMuWmU9ITF9Yy5Gaj1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LEFjOmZ1bmN0aW9uKCl7dGhpcy5aZXx8KHRoaXMuWmU9ZS5hYSgxMCkpO3JldHVybiB0aGlzLlplfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuTmdbYV0mJih0aGlzLk5nW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLAp0aGlzLkh1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnp0KGEuZGF0YSl9LAp6dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LGxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudHEoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmVoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KbmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sa246ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy52YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmVxKGEpKXJldHVybjsoYj10aGlzLmxnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT0KYX19LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxmYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHNlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sQ2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6CiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxKaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxXZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LHplOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCwKZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOwowPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZShhKX0uYmluZCh0aGlzKSwxMDApfSxHYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDwKYTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9CjA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHQucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLQo4XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt4PWs7dT1sO3I9bTtmb3IoZj0wOzE5Pj1mO2YrKylwPWQocSw1KSsobiZ4fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrCmIoZykrYihrKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7CnJldHVybiBifSxGcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5SYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxTYTpmdW5jdGlvbigpe3ZhciBhPXtDaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxacTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSwKQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEFrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxobzpmdW5jdGlvbigpe3JldHVybiBhLkNpKCl8fGEuSmkoKXx8YS5acSgpfHxhLkNsKCl8fGEuT20oKXx8YS5BaygpfHxhLiRsKCl9fTtyZXR1cm4gbnVsbCE9YS5obygpfSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEJjOmZ1bmN0aW9uKGEpe2E9dGhpcy52YShhKS5ob3N0LnNwbGl0KCIuIik7CnZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LENxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudmEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxmcDpmdW5jdGlvbihhLApiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sQ3U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuWGgoYikrIjoiK3RoaXMuWGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxhZjpmdW5jdGlvbihhKXt0aGlzLlhiPQphfSx2ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlhiO3RoaXMuVmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHljOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLllhKGIsZCkpO2ImJihCPWsuWWEoYSxiKSk7ZiYmKEI9ay5ZYShCLGYpKTtxJiYoQj1rLllhKEIscSkpO2MmJihCPWsuWWEoQixjKSk7ZyYmKEI9ay5ZYShCLGMpKTtlLnljKEIpfSxDdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmCjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTtiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DdChhKTtpZihiKWlmKCFsfHwKIWwuWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuemQoKTtsLnhhKGEsITApO2E9bC54YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pOwp0aGlzLk1jW2ZdfHwodGhpcy5NY1tmXT0wKTt0aGlzLk1jW2ZdKys7MTA8dGhpcy5NY1tmXXx8KGY9bC56ZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC54YShmLCEwKSxmPWwueGEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsCihmWzBdP2ZbMF06IiIpKyhmWzFdP2ZbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sR2U6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuRm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxxZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMua2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmxkKGEpOiIifSxsZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSwKYixkLGYpe2Q9ITE7aWYoYi5CZShhKXx8dGhpcy5KcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LlllJiZ3aW5kb3cuc2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7CmQmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLlphKGEsYi5IYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5vZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5rbihlLGEpO3JldHVybiBlfSxaYTpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godGMpe2ModGMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7CmVsc2V7bS54YShhLGUpO2U9bS54YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uSWEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYKMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LCRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLktjKWZvcih2YXIgYyBpbiB0aGlzLktjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuS2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKToKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYSxmLkhhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy4kcihmLm9kKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LYz1hfSx3dzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuWmEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTsKZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0saW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxEcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5Ganx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Faj1iO2IuWWE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnB0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLk1wPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iuc3c9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5MZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuUWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuVWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmNuPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkh2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaGc9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Vbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmJkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuYWQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlNmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5lbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUmM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLldkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLllkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuZG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmRpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuQnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5zZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi5wZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuaWc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmN3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkR2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIuRXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkN2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpO3ZhciBrPWMuRWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnc9dGhpcy5hWzhdO3RoaXMuZW89dGhpcy5hWzNdO3RoaXMudGk9dGhpcy5hWzRdO3RoaXMuVGo9dGhpcy5hWzhdO3RoaXMubW09dGhpcy5hWzldO3RoaXMuY3I9CnRoaXMuYVsyXTt0aGlzLnNyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLnJuPWI7Yi5wcm90b3R5cGU9e2V3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mdzp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZW86dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50aTp0aGlzLlNqKGEpfSxTajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVGo6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1tOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jcjp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLnJufHxqYSx1Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuZXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Haj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHhxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lKwpuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxqZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuamQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5qZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudWUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5qZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sVGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLnhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuamQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuR2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXc9dGhpcy5hWzNdO3RoaXMuQXA9dGhpcy5hWzJdO3RoaXMuYXY9dGhpcy5hWzEwXTt0aGlzLnZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs0XX1jLmR1PWI7Yi5wcm90b3R5cGU9e3p3OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuQXc6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFwOnRoaXMuJHUoYSl9LCR1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmR1fHxrYSx2Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy56dyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuUWk9Yn0pKGMpO3ZhciBMPWMuUWl8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGk9dGhpcy5hWzddO3RoaXMuaGo9dGhpcy5hWzEwXTt0aGlzLnpuPXRoaXMuYVs0XTt0aGlzLnJpPQp0aGlzLmFbOV07dGhpcy5Ucj10aGlzLmFbOV07dGhpcy50bj10aGlzLmFbMTBdO3RoaXMuT2s9dGhpcy5hWzNdO3RoaXMua289dGhpcy5hWzVdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuS249dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy53bD1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTGk6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhqOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bjp0aGlzLnBpKGEpfSxwaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucmk6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRyOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG46dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmtvOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jdDp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLndsfHxsYSx3Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuS2E9e307dGhpcy5JPW51bGw7dGhpcy5IYz0xMDA7dGhpcy5IYj0wO3RoaXMuVGE9MTUwO3RoaXMuS2I9MDt0aGlzLmt1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYT8odGhpcy5IYisrLHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuSGMpKTowPnRoaXMuVGEmJih0aGlzLktiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IYj50aGlzLlRhPyEwOiExfSxYZTpmdW5jdGlvbigpe3RoaXMuSGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGt1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5LYVtiLmphKCldPWI7TSYmTS5haCYmTS5HdShiKX0sV3c6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZSh0aGlzLkthKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9LEVyOmZ1bmN0aW9uKGIpe2I9Yi5HYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkthKWlmKGIuaWQ9PQp0aGlzLkthW2FdLkdhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG54OmZ1bmN0aW9uKGIpe3RoaXMuS2FbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBwPWMuTmx8fHA7KGZ1bmN0aW9uKGMpe2MuUGw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5IYz0xMDt0aGlzLkhiPTA7dGhpcy5UYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLm5nPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuR2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTGE6ZnVuY3Rpb24oKXt9LApzdTpmdW5jdGlvbihiKXt0aGlzLlc9Yn0sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XfSxudTpmdW5jdGlvbihiKXt0aGlzLkplPWJ9LFZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmV9LEllOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYSYmKHRoaXMuSGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkhjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHB4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlFxKCl8fHRoaXMuZm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxKYTpmdW5jdGlvbigpe3JldHVybiExfSxmeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEljOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRWg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSx6aDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sJHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGt4OmZ1bmN0aW9uKCl7dGhpcy5uZ3x8KHRoaXMubmc9ITApfSxwZTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5QbHx8dDsoZnVuY3Rpb24oYyl7Yy5taT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkhmPSIxIjt0aGlzLklmPSIyIjt0aGlzLlptPSIzIjt0aGlzLk9jPTA7dGhpcy5paD0KMzA7dGhpcy5QYj1bXTt0aGlzLmdiPVtdO3RoaXMubWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuV2Y9dGhpcy4kaD0hMTt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5iZihiKTt0aGlzLmx1KGEpfSxnOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3RoaXMuJGh8fCh0aGlzLiRoPSEwLGUuR2UoKSl9LE5lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5ZYiYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9CmUuQWMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLkFjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT0xfSxCcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldLmluaXRpYXRvciE9ZS5BYygpJiYodGhpcy5jZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnVhKCkpe3RoaXMudnIoKTtpZighdGhpcy5CcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5jZigpO3JldHVybn10aGlzLmNmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5UaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLAphKXt0aGlzLnVhKCl8fCh0aGlzLlBiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sVGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1lLnVuaXF1ZSh0aGlzLlBiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5tY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm1jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMubWNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLApiLCEwLGEpfX0sWnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSGZ9LGNmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0scXU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlptfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuT2N9LE5mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkhmfSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5JZn0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuT2N9LGJmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sbHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LHZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sY3M6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLm1pfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbN107dGhpcy5KbD10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMTBdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuZXA9YjtiLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zbjp0aGlzLklsKGEpfSxJbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkpsOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tcDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc206dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFxOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7CnZhciBuYT1jLmVwfHxuYSx4Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Ybig0KTsoZnVuY3Rpb24oYyl7Yy5waj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5wanx8b2E7KGZ1bmN0aW9uKGMpe2MucWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLkl3O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMucWp8fHBhOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLnJqfHxxYTsobmV3IHFhKHIpKS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm1sPWI7Yi5wcm90b3R5cGU9e2hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLm1sfHxyYSx5Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ocig0KTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3RoaXMuc2coKTt0aGlzLnVnKCk7dGhpcy5Ubz0hMX0sc2c6ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuWmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5aYil7dmFyIGI9dGhpcy5HYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuWmI9ITApO3RoaXMuWihhKX19LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sSWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkplJiYoMCx0aGlzLkplKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5oa3x8c2E7KGZ1bmN0aW9uKGMpe2MuZ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuWGQ9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5QYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJgohdGhpcy51YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMucmEoKSx0aGlzLmdldFBsYXllcigpLlRvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS52ZCgpLGEua2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUGM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5OZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlFjLmluZGV4T2YoYSkmJgp0aGlzLlFjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5RYy5sZW5ndGg+PXRoaXMuWGQmJnRoaXMubSgpKX0sY3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5uZT90aGlzLm5lKys6dGhpcy5uZT0xOnRoaXMubWU/dGhpcy5tZSsrOnRoaXMubWU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSmgoYS52aWRlb1RhZyk/YS5aYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlBjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuWmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5na3x8dGE7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ycSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkVyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sVHc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnJxOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5pa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVqPXRoaXMuYVsyXTt0aGlzLnh1PXRoaXMuYVs2XTt0aGlzLnprPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMuVW49YjtiLnByb3RvdHlwZT17ZGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVqOnRoaXMud3UoYSl9LHd1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54dTp0aGlzLnlrKGEpfSx5azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuems6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlVufHx3YSx6Yz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuZGooNCk7KGZ1bmN0aW9uKGMpe2MuR209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVihhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0KYi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuVyYmdGhpcy5XKCl9LHllOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0scWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLkdtfHx4YTsoZnVuY3Rpb24oYyl7Yy5GbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRGM9dGhpcy55YT10aGlzLlVjPSExO3RoaXMudmg9ZS5HYigxMCk7dGhpcy5aaD0hMDt0aGlzLnJjPXRoaXMuUWc9ITE7dGhpcy54cyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLkNvKCksdGhpcy5xYigpKX0seHM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuemEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5YLCI7Iix0eXBlb2YgYi5YLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlg/Yi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5YP3R5cGVvZiBiLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRWE/Yi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5FYT90eXBlb2YgYi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLkVhP2IuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouRWE/dHlwZW9mIGIuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouVWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRGN9LENyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQXIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlVjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5VYz0hMCk7cmV0dXJuIHRoaXMuVWN9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5WYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5SdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LFJ0OmZ1bmN0aW9uKCl7dGhpcy5yYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGUuemEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sU3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSwKQ286ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxkZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlkpaG9tYWRVdGlscy5SYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkNyKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuVmIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuVmIoKSx0aGlzLnJjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMudygpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuVmIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5CYSgpO2JyZWFrfX0sRG86ZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy53Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMud2MhPWIuYWRzLnN0YXRlJiYodGhpcy53Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy53Yyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLndjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EbygpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQmE6ZnVuY3Rpb24oKXswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMudWEoKXx8KGJ8fCh0aGlzLlpoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLlpoLGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxJbzpmdW5jdGlvbigpe3RoaXMuYXh8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuUXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5XdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxXdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5GbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuS2god2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLktoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LEtoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnNlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubWF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgemE9Yy5IbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRrPXRoaXMuYVs0XTt0aGlzLmZrPXRoaXMuYVs0XTt0aGlzLnF3PXRoaXMuYVsxXTt0aGlzLnZsPXRoaXMuYVsyXTt0aGlzLnZ1PXRoaXMuYVs5XTt0aGlzLmpsPXRoaXMuYVs0XTt0aGlzLkJ1PXRoaXMuYVs1XTt0aGlzLm9qPXRoaXMuYVs0XTt0aGlzLkNqPQp0aGlzLmFbNF07dGhpcy5nbT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLlppPWI7Yi5wcm90b3R5cGU9e3NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50azp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZms6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnF3OnRoaXMudWwoYSl9LHVsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bDp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnU6dGhpcy5pbChhKX0saWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpsOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2o6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMuZm0oYSl9LGZtOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuZ206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5aaXx8QmEsQWM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuRWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5QZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sd3Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMuamEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuWWImJigwPD1oLmluZGV4T2YoZCl8fGEudmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlBlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLlBlKys7aWYoMTA8dGhpcy5QZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7CnZhciBDYT1jLkVsfHxDYTsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe2lmKCF0aGlzLm9lKWlmKHRoaXMuQ2J8fCh0aGlzLkNiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuQ2IrKywxNTx0aGlzLkNiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMub2U9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCl9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnlhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5VcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLlVwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2Iud3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuRGx8fERhOyhmdW5jdGlvbihjKXtjLkZsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVGE9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubWF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLkZsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuYm49dGhpcy5hWzhdO3RoaXMub3A9dGhpcy5hWzFdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOV19Yy5FbT1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXA6dGhpcy5hbihhKX0sYW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcDp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLnJ0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5FbXx8R2EsQmM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy55dD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PQpiLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnl0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuZ2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5nZCl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5XZyh0aGlzLmdkKTtlLnplKHRoaXMuZ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLAo1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmFrfHxIYTsoZnVuY3Rpb24oYyl7Yy4kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy4kanx8SWE7KGZ1bmN0aW9uKGMpe2MuYms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5UYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuQ2coYiwiZWxlbWVudElEIik7aWYoZS5XZyhhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5LYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5LYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIEphPWMuYmt8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xcz10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzVdO3RoaXMuUGk9dGhpcy5hWzFdO3RoaXMuJHQ9dGhpcy5hWzNdO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbN119Yy56bz1iO2IucHJvdG90eXBlPXtWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmltOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJHQ6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuem98fExhLENjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLlZzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Iaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxtdTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGduOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuSGp8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5lYj1hO3RoaXMueGc9CnRoaXMuaGk9ITE7dGhpcy5taD1kO3RoaXMuTGg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZWI9bmV3IHooYSkpO3ZhciBjPXRoaXMuc2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJmwmJmwuQ2UodGhpcy5lYi51cmwpJiZsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5tdSgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmthKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LApmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLklqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmViLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLnhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5MaD90aGlzLnNiLm9wZW4odGhpcy5lYi5tZXRob2QsdGhpcy5lYi51cmwsITEpOnRoaXMuc2Iub3Blbih0aGlzLmViLm1ldGhvZCx0aGlzLmViLnVybCwhMCksdGhpcy5oaXx8KHRoaXMuc2Iud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLAphWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5zYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuQ2UodGhpcy5lYi51cmwpP2wuS2Q/bC5rYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5DZSh0aGlzLmViLnVybCksdGhpcy5taCYmdGhpcy5taCgpfXJldHVybiB0aGlzLnNifX19KShjKTt2YXIgTWE9Yy5Janx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJhPSExO3RoaXMudWM9IiI7dGhpcy5jZT10aGlzLnRjPXRoaXMud2I9bnVsbDt0aGlzLmdwPXRoaXMuSWI9dGhpcy5kaD0hMTt0aGlzLkhhPSIiO3RoaXMuWWc9ITE7dGhpcy5EYT10aGlzLm1kPSIiO3RoaXMuVWc9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLktnPXRoaXMuY2M9IiI7dGhpcy5sZT0hMTt0aGlzLm1mPTA7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjsKdGhpcy5BZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuT2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmVjPSIiO3RoaXMuZmM9W107dGhpcy5nYz1bXTt0aGlzLklkPVtdO3RoaXMuZGM9IiI7dGhpcy5uZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNjPSExO3RoaXMuSm89dGhpcy5NZD1udWxsO3RoaXMuR2g9dGhpcy5qYz10aGlzLnBnPXRoaXMucWY9dGhpcy5LZD10aGlzLmZlPXRoaXMuVmQ9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5uZD0wO3RoaXMuTWc9ITE7dGhpcy5MZz0xRTM7dGhpcy5XYz0hMTt0aGlzLk9hPTFFMzt0aGlzLktmPSIifWMuSmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuUmEsCmFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuZGgsc2lkZWxvYWRzOnRoaXMuSWIsZGlzYWJsZXRlc3RzOnRoaXMuZ3AsaG9tYWRBbGlhczp0aGlzLkhhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5ZZyxnbG9iYWxDb25maWc6dGhpcy5tZCxjbGllbnRDb25maWc6dGhpcy5EYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlksaXNCbG9ja2VkOnRoaXMuVWcsc2VydmVyOnRoaXMuQWEsc3ZtQ29uZmlnOnRoaXMuY2MsaG9tYWRBZHBhdGg6dGhpcy5LZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmxlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm1mLEhPTUFEX1ZFUklGSUVEOnRoaXMuQ2YsSE9NQURfQkxPQ0tFRDp0aGlzLkFmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLk9iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmxjLApIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuQmYsdGVzdEhpZGU6dGhpcy5lYyx0ZXN0VGFnczp0aGlzLmZjLHRlc3RUYWdzSlM6dGhpcy5nYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5kYyx0aHJvdHRsZTp0aGlzLm5mLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuQ2MsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlZkLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5mZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5LZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5xZixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5iYixzZXJ2ZXJJZDp0aGlzLkRoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmpjLHNraXBBbGxvd2VkOnRoaXMuR2gsdm1hcHM6dGhpcy5laSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuV2MsYWRGYWxsYmFja1VSTDp0aGlzLktmfX0sCk9xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0sc3E6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLApkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5pbyhhKX0seGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlJhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkJlKGEpO2M9dGhpcy52YShhKTtmPyh0aGlzLnBkKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnpkKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMudWN8fHRoaXMud2J8fHRoaXMudGN8fHRoaXMuY2UpJiYoZz10aGlzLmtzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMudXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PQpnO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLnBkKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxwZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5BYSYmdGhpcy5BYS5sZW5ndGgmJjA8dGhpcy5BYS5sZW5ndGgmJihiPXRoaXMuQWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPQpiLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuQmUoYSk7cmV0dXJuIGJ9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5IYSYmMDx0aGlzLkhhLmxlbmd0aClyZXR1cm4gdGhpcy5IYTtmb3IoZCBpbiB0aGlzLkhhKWlmKGI9dGhpcy5IYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk53O3JldHVybiJub25lIn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BYVt0aGlzLkRoXX0semQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9kKCksYj10aGlzLkZoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLApiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxqczpmdW5jdGlvbihhLGIpe3ZhciBkPWUudmEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEg9MDtIPGcubGVuZ3RoO0grKyl7dmFyIGs9Z1tIXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLmpoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9CnRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxrczpmdW5jdGlvbihhKXt0aGlzLnVjJiYoYSs9dGhpcy51Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy50YyYmKGE9dGhpcy5qcyhhLHRoaXMudGMpKTtyZXR1cm4gYX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bD10aGlzO3RoaXMuWWc9ITA7dGhpcy5tZD1hO3RoaXMuRGE9Yjt0aGlzLlZlPWQ7dGhpcy5NZD1mO3RoaXMueGM9Yzt0aGlzLmJiPWV8fHt9O3RoaXMuWnIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuRGEpdGhpcy5YcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5EYSl0cnl7dGhpcy5EYT0KYigpLHRoaXMuWmMoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFpyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLm1kK3RoaXMuJGQoImdsb2JhbCIpKSx0aGlzLktxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLiRlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuWmMoKX0uYmluZCh0aGlzKSwhMCl9LFhyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLkRhK3RoaXMuJGQoImNsaWVudCIsLTEhPXRoaXMuRGEuaW5kZXhPZigiPyIpKSksdGhpcy5aYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy4kZSgiY2xpZW50Iik7dGhpcy5rYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5HYigpKTt0aGlzLmJiJiZ0aGlzLmJiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5iYiYmdGhpcy5iYi5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGthOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKXt0aGlzLmZlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnhjPSExKTt0aGlzLnhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueGM/dGhpcy54YygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuVWc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkFmKSk7dGhpcy5MYigpO2UueWMoay5wdCk7KGI9ZS5CYyh0aGlzLm9kKCkpKXx8KGI9ZS5CYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sS3E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkRhfHx0aGlzLmNjfHx0aGlzLkhhfHx0aGlzLlpjKCk6KHRoaXMuUmE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLk9iKSksdGhpcy5MYigpKX19LFpjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLkRhfWVsc2UgYT10aGlzLkRhO3RoaXMuaXNFbmFibGVkPXRoaXMuaGMoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLmNjPWEuY29uZmlnfHwiIjt0aGlzLkhhPWEuYWxpYXN8fG51bGw7dGhpcy5LZz1hLmFkcGF0aHx8IiI7dGhpcy5sZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkRoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuY2MmJnRoaXMuSGEmJnRoaXMuQWEubGVuZ3RoP3RoaXMuRWMoITEpOih0aGlzLlJhPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLkxiKCkpfSxFYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLnpkKCkpLGQ9dGhpcy52YSh0aGlzLmNjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuY2MrdGhpcy4kZCgiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMuSnUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuJGUoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMua2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwKMTAwKSk6dGhpcy5FYyghMCl9LmJpbmQodGhpcyksITApfX0sSnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5DYz0hMDt0aGlzLkVjKCEwKTtyZXR1cm59fXRoaXMuS2Q9dGhpcy5oYyhiLnN0cmljdCk7dGhpcy5xZj10aGlzLmhjKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnBnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmhjKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuZWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5nYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy51Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8Cm51bGw7dGhpcy50Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZGg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5JYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1iLnZwYWlkfHwhMTt0aGlzLmJiLnZwYWlkPXRoaXMuamM7dGhpcy5HaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlhjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5laT1iLnZtYXBzfHwiIjt0aGlzLldjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1iLmJpdHJhdGV8fDFFMzt0aGlzLktmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmRjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuQnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmxlJiYodGhpcy5kYz1udWxsKTt0aGlzLm5mPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPQpiLnZpZGVvcGxhemF8fHt9OyF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5DYz0hMCx0aGlzLkVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmJ2KCkmJih0aGlzLmVjfHx0aGlzLmdjfHx0aGlzLmZjfHx0aGlzLmRjfHx0aGlzLklkKT90aGlzLlZlPyh0aGlzLlJhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMuaGUoKSx0aGlzLkxiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5PdSgpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuUHUoKX0sUHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUuZmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMuYmImJnRoaXMuYmIucGxheWVyJiZ0aGlzLmJiLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5rYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLkxiKCl9LExjOmZ1bmN0aW9uKGEpe3RoaXMuVmQ9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLkxiKCksdGhpcy5oZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmVjKXt2YXIgYT1lLmZkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5iaCgpKXRoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5lYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuUGgoKX19ZWxzZSB0aGlzLlBoKCl9LE9oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkdiKCkpO3RoaXMuU3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmpmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MYyh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmZjPXRoaXMuSWQpJiZ0aGlzLmZjLmxlbmd0aCl7dmFyIGQ9dGhpcy5mYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmpmKCl9LFN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxQaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigpKTt0aGlzLlR1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5PaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuZ2MmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZD10aGlzLmdjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuT2goKX0sVHU6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxqZjpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMubWYrKyx0aGlzLklhKG5ldyB6KHRoaXMuZGMpLHRoaXMuTHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5NaCgpfSxrZjpmdW5jdGlvbihhKXt0aGlzLkxjKHRoaXMuQmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxMdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5tZj90aGlzLmpmKCk6dGhpcy5rZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuTWgoKTp0aGlzLmtmKCJBQUEiKX0sTWg6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTsKdGhpcy5MYigpO3RoaXMuaGUoKX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxMYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5TYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlZkJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS56YSgidC1vbmxpbmUuZGUiKXx8ZS56YSgiZ2lnYS5kZSIpfHxlLnphKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmJoKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkNmKSk7dGhpcy5NZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk1kJiZ0aGlzLk1kKCl9LEdvOmZ1bmN0aW9uKCl7aWYodGhpcy5xZiYmCnRoaXMuT3EoKSl7dmFyIGE9dGhpcy5zcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sVGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5uZHx8KHRoaXMubmQ9MCk7dGhpcy5uZCsrO3RoaXMubmQ+dGhpcy5MZyYmIXRoaXMuTWcmJih0aGlzLk1nPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5MZywhMCkpO2E9bmV3IE1hKGEsYixkKTtmJiYoYS5oaT0hMCk7YyYmZS5GcigpJiYoYS54Zz0hMCk7ZyYmKGEuTGg9ITApO3JldHVybiBhLmxvYWQoKX0sRW86ZnVuY3Rpb24oKXtlLlNhKCl8fGUuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmthKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnBkKCl8fChhPXRoaXMudmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZWl9LEZvOmZ1bmN0aW9uKCl7dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkd2LmJpbmQodGhpcyksdGhpcy5Gdi5iaW5kKHRoaXMpKX0sR3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLk9wKCl9LEZ2OmZ1bmN0aW9uKCl7fSxPcDpmdW5jdGlvbigpe2UueWMoay5OcCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5rYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0saGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkliLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkliW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlphKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5pYSgpXT10aGlzO2UuWmEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5uZn0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEdiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0saGM6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEZoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsaCxjO2ZvcihoPTc7MDw9aDtoLS0pYz1hPj4+NCpoJjE1LGQrPWMudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGU9QXJyYXkoODApLGc9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHI9MzI4NTM3NzUyMCxuLHAsdSx0LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj0KYS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGYpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyllW2ZdPXdbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspZVtmXT1kKGVbZi0zXV5lW2YtOF1eZVtmLTE0XV5lW2YtMTZdLDEpO2M9ZztuPWs7cD1sO3U9bTt0PXI7Zm9yKGY9MDsxOT49ZjtmKyspdj1kKGMsNSkrKG4mcHx+biZ1KSt0K2VbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj00MDs1OT49ZjtmKyspdj1kKGMsNSkrKG4mcHxuJnV8cCZ1KSt0K2VbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NjA7Nzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2c9ZytjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7cj1yK3QmNDI5NDk2NzI5NX1yZXR1cm4oYihnKStiKGspK2IobCkrYihtKStiKHIpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5Kanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaXA9CnRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLlprPXRoaXMuYVsxMF07dGhpcy5vbz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs5XX1jLk5yPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLnBzKGEpfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXM6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlwOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ldDp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWms6dGhpcy5ubyhhKX0sbm86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgT2E9Yy5Ocnx8T2EsRGM9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkxxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5QP3RoaXMuJGE9YS5mLlAoKTp0aGlzLiRhPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnZkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuQmguYmluZCh0aGlzKSxtdXRlOnRoaXMuS2UuYmluZCh0aGlzKSx1bm11dGU6dGhpcy50di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVGI9dGhpcy5WYz0hMTt0aGlzLmZvPTFFMzt0aGlzLnBhPW51bGw7dGhpcy5MPWI7dGhpcy5OYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMucm89ZS5hYSgxMCk7dGhpcy5mZj0wO3RoaXMuVGM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5UYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJgooKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuVGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubm49ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5uaD10aGlzLkVkPSExO3RoaXMuZ2g9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLlpkPSExO3RoaXMuV2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5ZYj0hMTt0aGlzLlZvPWUuYWEoMTApO3RoaXMuRmI9ZS5hYSgxMCk7dGhpcy5EYj1lLmFhKDEwKTt0aGlzLkhoPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5qZT10aGlzLmNkPXRoaXMuaGY9dGhpcy5yYj10aGlzLmtjPXRoaXMucGg9dGhpcy5oZD10aGlzLmN2PXRoaXMudWI9dGhpcy5FYj0hMTt0aGlzLnBjPVtdOwp0aGlzLiRiPXt9O3RoaXMuaHQ9MjAwO3RoaXMueGY9dGhpcy55Zj10aGlzLmVlPXRoaXMud2Y9dGhpcy5VZT0hMTt0aGlzLnVkPXt9fWMuRGo9YjtiLnByb3RvdHlwZT17aHU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy4kYV0mJnRoaXMuY29uZlt0aGlzLiRhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuJGFdW2FdKTtyZXR1cm4gYn0sVWg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuWGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLkdkKCJjYWxsIix0aGlzLldhKCkpO2UudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEZlOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMudWI9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlkpdGhpcy5mZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLAp0aGlzLkwuR28oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlJhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlVoKCksbmV3IFModGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuVWgoKSxuZXcgUyh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKToKdGhpcy5QYSgpO2Vsc2V7dmFyIHNjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3NjLkZlKGEsYixkKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7YS5YYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5oZD0hMTt0aGlzLmM9YTt0aGlzLnR1KHRoaXMuYyk7dGhpcy51ZD1uZXcgUGEodGhpcy5jLkl2LHRoaXMudmlkZW8se30pO3RoaXMuSGcoYSk7dGhpcy5wYz10aGlzLnpnKGEpO3RoaXMuUW8oKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5FcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ucShhKSkpOwpyZXR1cm4gY30sbnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LEVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0KMDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlhhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZWQmJmEuZWQuZXJyb3ImJmEuZWQuZXJyb3IuY29kZSYmKGI9YS5lZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk5jLmNvZGU6Yj09Ri5SZC5jb2RlP2UudihrLmR3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSwKdGhpcy5CKCksdGhpcy5DKCkpOihlLkdlKCksYj09Ri5GZi5jb2RlJiZlLnYoay55cyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay5NcCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuR2QoImVtcHR5Iix0aGlzLldhKCkpO3RoaXMuVWEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5HZi5jb2RlOmUudihrLm93LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuc3csdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudihrLnpzLHRoaXMuYy5BLAp0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay5Edix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuemYuY29kZTplLnYoay5Fdix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5VYihhKTt0aGlzLlBhKCl9LFViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgYz1hLk5hLnBvcCgpO3RoaXMuRWUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHR1OmZ1bmN0aW9uKGEpe3RoaXMuamU9ITE7dGhpcy5OYj10aGlzLmIuSzsKdmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuTmIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlVlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXg9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTsKdGhpcy5ubiYmdGhpcy5wbGF5ZXIucGUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnBlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5obihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuVWUmJmIubG9hZCgpO2lmKHRoaXMuUWgoYikpe3RoaXMuR2QoInNldHVwIix0aGlzLldhKCkpO3RoaXMubG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlVlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPQp0aGlzLnBhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUm8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5wYS5hcHBlbmRDaGlsZChiKSx0aGlzLnJ1KCkpOnRoaXMuYy5vcmlnaW4ucWcody5RZCl9LHJ1OmZ1bmN0aW9uKCl7dGhpcy53Zj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmI9ITApO2UuaWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJmUubW4odGhpcy5jLm9yaWdpbi5zYSk7CmUuZmIoInNldFVwVnBhaWQiKTt0aGlzLkdkKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnFoKCk7dGhpcy5iLmRmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5kZigpO3RoaXMucGE9dGhpcy5OYj10aGlzLmIuSzt0aGlzLmFpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5KYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuSHEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmFlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLldiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnBjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuU3YoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5UdigpLHRoaXMuYi5XYighMCksIXRoaXMuTWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuTWI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkFlKHRoaXMuTWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5XYighMCksdGhpcy5YdigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuV2IoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWnYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuJHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5idygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5TYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5oZyx0aGlzLmMuQSwKdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLldjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy55ZiYmKHRoaXMueGY9ITEsdGhpcy5iYygpKSx0aGlzLlZ2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnJiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5KYigibXV0ZWQiLCJ1c2VyIiksZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkpiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnBmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLllkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLmFlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5YZihmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5XZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5rYz0hMH0sVnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMua2M9ITF9LFh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sCld2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlNmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZmIoImltcHJlc3Npb24iKTt0aGlzLkloKCk7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZmIoInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxadjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmhkPSEwO2UuZmIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sJHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpOwplLmZiKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5mYigidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMuc2YoKTtlLmZiKCJjb21wbGV0ZSIpO3RoaXMuVmEoImNvbXBsZXRlIil9LGZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZmIoImFkc3RvcHBlZCIpO3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuaWUoKTsKdGhpcy5IPSExO3RoaXMuUGEoYSl9fSxTdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLmZiKCJlcnIiLGIpO2UudihrLmN3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5maSghMCl9LGhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuUmEmJmIuaXNFbmFibGVkJiYhYi5wZCgpKXt2YXIgZD1iLnZhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsCnRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuTnYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxRaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sbG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuYmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxiaTpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGJ8fHRoaXMudWYoYSl9LmJpbmQodGhpcyksdGhpcy5mbykpfSx1ZjpmdW5jdGlvbihhKXtpZighdGhpcy5WYyYmdGhpcy5RaCh0aGlzLnZpZGVvKSYmIXRoaXMuRWImJiF0aGlzLlRiKXt0aGlzLlZjPSEwO3RyeXtpZighZS5TYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRWJ8fCh0aGlzLkViPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMuS3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5kZigpO3RoaXMuSnYoKTt0aGlzLmFpKCk7dGhpcy5hZygpO3RoaXMuYi5xaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5nZigpfX0sZ2Y6ZnVuY3Rpb24oKXt0aGlzLmNkfHx0aGlzLk1mKCl9LE1mOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuY2R8fChhP3RoaXMuUGEoKToodGhpcy5LZSghMCksdGhpcy5NZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmFjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0uYmluZCh0aGlzKTt0aGlzLnJlKCkuRWgodGhpcyl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5FYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLmNuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5QYSgpfSxQYTpmdW5jdGlvbihhKXtpZighdGhpcy5qZSlpZih0aGlzLmplPQohMCx0aGlzLk5kfHwoZS52KGsuQnMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5uYyl7ZS5vYigibmV3U21hbGxBZElkIik7dGhpcy5mZisrO3RoaXMuVGI9dGhpcy5WYz0hMTt0cnl7dGhpcy5BZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLk5iLnJlbW92ZUNoaWxkKHRoaXMucGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5ZaCgpfWNhdGNoKGcpe310aGlzLmhmPSEwO3RoaXMuYi52ZSgpO3RoaXMuWWI9ITE7dGhpcy5yZSgpLnpoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLkxlKCk7dGhpcy5jLm5jJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5rZSgpKX1lbHNlIHRoaXMua2UoKX0sTnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7CnRoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50ZihhKSl9LHRmOmZ1bmN0aW9uKGEpe3RoaXMuVGI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLkVvKCk7dGhpcy5jLm9yaWdpbi5xZyh3LlFkKX0sY2k6ZnVuY3Rpb24oKXtpZih0aGlzLmN2KXRoaXMuUGEoKTtlbHNle3RoaXMuWWI9ITA7dGhpcy5iLmYuSmEmJiF0aGlzLmhmJiZ0aGlzLmIuZi5KYSgpJiZlLnYoay5hZCx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5mdihhKTtpZighdGhpcy5NYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmCih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5NYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuQWUodGhpcy5NYil9Yz0iIjt0aGlzLmMuZWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGgpKSYmKGM9dGhpcy5jLmVmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSwKdGhpcy5FZHx8KHRoaXMuRWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMudGI/KHRoaXMuVGI9dGhpcy5WYz0hMSx0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5OYi5yZW1vdmVDaGlsZCh0aGlzLnBhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLlloKCksdGhpcy5jLm9yaWdpbi5MZSgpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlRjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlpkPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxWaDpmdW5jdGlvbigpe3RoaXMucGh8fAoodGhpcy5waD0hMCx0aGlzLmhkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sZnY6ZnVuY3Rpb24oYSl7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLldofHx0aGlzLkVifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuVmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZoKCl9LmJpbmQodGhpcykpLHRoaXMuRWJ8fHRoaXMuSWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5WYSgic3RhcnQiKSxlLnYoay5PZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksCnRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5qYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmhkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5RZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLAoidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuV2g9YSl9LEdkOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxJaDpmdW5jdGlvbigpe2UudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLHRoaXMuV2EoKSwhMCl9LFVhOmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX2hkX2FkX2Vycm9yIixhLCEwKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMud2Z8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxKYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkViKXt0aGlzLnVkJiZ0aGlzLnVkLnRyYWNrJiZ0aGlzLnVkLnRyYWNrKGEpOwppZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5GcSh0aGlzLmMuTmEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRHIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5FZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZG4sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKGcudXJsLApnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuY3AodGhpcy5jLk5hLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWUuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLndmJiYoYj0iX3ZwYWlkIik7dGhpcy55ZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxFZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC54YShhKSxjJiZiLmduKGMpLGZ8fChmPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuam4oYSksdGhpcy5MLklhKGIsZnVuY3Rpb24oKXt0aGlzLnloKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGpuOmZ1bmN0aW9uKGEpe3RoaXMuJGJbYV09Im9wZW4ifSx5aDpmdW5jdGlvbihhKXt0aGlzLiRiW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuJGI9e319LEZ1OmZ1bmN0aW9uKCl7dmFyIGE9CjAsYjtmb3IoYiBpbiB0aGlzLiRiKXRoaXMuJGIuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy4kYltiXSYmYSsrO3JldHVybiBhfSxGcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGNwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEt2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mdi5iaW5kKHRoaXMpKX0sTHY6ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmJjKCk6dGhpcy5jLlNiJiYoZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KIl90b3AiO3RoaXMuTC5XYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5TYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuU2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxKdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLAphLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5UYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5YYyYmKGI9dGhpcy5MLlhjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnBhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJgp0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxhaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuVm87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuRmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5TaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuYmMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkRiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ldi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5kdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkhoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmVmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXToKKGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLnBhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5YZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi5xYSYmdGhpcy5iLmYucWEoKSYmKGUudihrLmlnLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5LZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGJjOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLnhmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuUmMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxTaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMua2M/KGUubGEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuSmIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwidXNlciIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMucmI/KGUubGEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sS2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwiY29udGVudCIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx0djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5KYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LGFjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmFjKTt0aGlzLmNkfHx0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0sa2U6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuZmQoKTshdGhpcy5MLmpjfHxlLlNhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5lZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5uaD8odGhpcy5jZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLmpnKCkpOih0aGlzLm5oPXRoaXMueWY9dGhpcy54Zj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKSx0aGlzLmVlPSEwLGE9ZS4kZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5GZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5GdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLHRoaXMuaHQpOih0aGlzLmhmPSEwLHRoaXMuYi52ZSgpLHRoaXMuYi5ZdCgpLHRoaXMuWWI9ITEsZS52KGsuVW8sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnJlKCkuemgoKSl9LHJlOmZ1bmN0aW9uKCl7dmFyIGE9Cm51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxhZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLnplKHRoaXMudmlkZW8sYSk/dGhpcy5CaCgpOnRoaXMudmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5TYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnBjJiYwPHRoaXMucGMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnBjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT0Ke307YS5hZHNlc3Npb25faWQ9dGhpcy5ybysiLSIrdGhpcy5mZjt0aGlzLmMmJnRoaXMuYy5EZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuRGcoKSk7cmV0dXJuIGF9LG9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5Eanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXY9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzZdO3RoaXMuY2w9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5WcT1iO2IucHJvdG90eXBlPXt4djpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXY6dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNpOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuVnF8fApSYSxFYz1uZXcgUmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy54dig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkNhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMub2M9dGhpcy5xYz0hMTt0aGlzLnNhPSIiO3RoaXMudmY9ITE7ZCYmZC5lbXB0eT90aGlzLmJzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuZmQoKSxiO2I9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7CmMmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOmwueGEobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLmxnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT0KY3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC54YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnhhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5hcy5iaW5kKHRoaXMpLHRoaXMuWXIuYmluZCh0aGlzKSl9LApBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5DYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuWGIpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7CnZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuQ2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLlhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5YYnx8dGhpcy5JcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5LdSgpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrCiciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtmW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxJcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmCmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGFzOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMuQ2E9YS5yZXNwb25zZVhNTCx0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuU2QpKX10aGlzLlg9dGhpcy5BZygpO3RoaXMucWM9dGhpcy5sZigpO3RoaXMub2M9dGhpcy5OaCgpOwp0aGlzLlgubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuUWEody5OYyx7ZXJyb3I6dGhpcy52Zj9GLlJkOkYuRWZ9KSl9LGJzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUWEody5TZCkpfXRoaXMuWD10aGlzLkFnKCk7dGhpcy5xYz10aGlzLmxmKCk7dGhpcy5vYz10aGlzLk5oKCk7dGhpcy5YLmxlbmd0aD90aGlzLkdjKCk6dGhpcy5vYSh0aGlzLlFhKHcuTmMse2Vycm9yOnRoaXMudmY/Ri5SZDpGLkVmfSkpfSxZcjpmdW5jdGlvbigpe3RoaXMub2EodGhpcy5RYSh3LkRmLHtkZXB0aDphfSkpfSxHYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLktyKCk/dGhpcy5VdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLklnKCksaCx7QWRTeXN0ZW06dGhpcy5tcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5vYSh0aGlzLlFhKHcuR2YpKTooYT0wLHRoaXMuQnYoKSYmdGhpcy5RZSh0aGlzLldvKCkpKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkdjKCkpOnRoaXMucGFyZW50LkxlKCl9LGtoOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5raCgpfSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ1KCk/dGhpcy5RdSgpPyEwOigtMSE9dGhpcy56YygpP3RoaXMub2EodGhpcy5RYSh3LlBkKSk6dGhpcy5vYSh0aGlzLlFhKHcuemYpKSwhMSk6KHRoaXMub2EodGhpcy5RYSh3Lk5jLEYuRmYpKSwhMSl9LFFlOmZ1bmN0aW9uKGEpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLk5hPWEuTmEuY29uY2F0KHRoaXMuSGUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWGE9CmEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuUWUoYSl9LFdvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLmR1cmF0aW9uPXRoaXMuemMoKTthLk89dGhpcy5GZygpO2EuU2I9dGhpcy5vcSgpO2EuSXY9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5scSgpO2EuZWY9dGhpcy5EcShhLmR1cmF0aW9uKTthLlhhPWEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLlhhPWIuWGE/Yi5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5OYT1iLmVycm9yLmNvZGUhPXcuUGQuY29kZT9iLk5hLmNvbmNhdCh0aGlzLnBxKCkpOmIuTmEuY29uY2F0KHRoaXMueXEoKSkpOwp0aGlzLlgubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5VYiYmdGhpcy5wYXJlbnQuVWIoYiksYT0wLHRoaXMuR2MoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxVYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5VYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUWEoYSxiKSl9LFFhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxSdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy56YygpfSxsZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxOaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMubGYoKSYmKGE9ITApO3JldHVybiBhfSxKdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMudmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sS3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LG1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxIZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0KIkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0seXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sCnBxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxvcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxPdzphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD0KYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5sZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxEcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkN1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubGQoYSk6IiJ9LGxkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9rPXRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVsxMF07dGhpcy5Qbz10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLlRwPWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMub2s6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhrOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qbzp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLlRwfHxVYSxGYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5uayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk5hPVtdO3RoaXMuTz1bXTt0aGlzLlNiPSIiO3RoaXMuQT10aGlzLm5jPXRoaXMudGI9ITE7dGhpcy53ZT10aGlzLm9yaWdpbj1udWxsO3RoaXMueGU9IiJ9Yy5NbD1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx3cTpmdW5jdGlvbigpe2lmKCF0aGlzLndlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkNhKXt2YXIgYT10aGlzLm9yaWdpbi5DYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLndlPWFbY10pfXJldHVybiB0aGlzLndlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueGUpcmV0dXJuIHRoaXMueGU7dmFyIGE9IiI7KGE9dGhpcy53cSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMueGU9YX0sSHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLk1sfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUG49dGhpcy5hWzZdO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuYXI9dGhpcy5hWzVdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5maj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUG46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkpwOnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hcjp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLmZqfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Obig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsCk1hOiJYTUxfUEFSU0VfRVJST1IifSx6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTWE6IkRVUkFUSU9OX0VSUk9SIn0sTmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE1hOiJFTVBUWV9WQVNUIn0sR2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTWE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LERmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsCm1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixNYToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixNYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEZ3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLApNYToiTUVESUFGSUxFX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTWE6IkRVTU1ZX0FEIn19LEY9e0VmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTWE6Ik5PX0FEUyJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixNYToiTk9fTUVESUFGSUxFUyJ9LEd3Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE1hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTWE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19CmMuVmo9YjtiLnByb3RvdHlwZT17bnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Wanx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMubnMoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5lZD1iO3RoaXMuTmE9W107dGhpcy5vcmlnaW49bnVsbH1jLmtqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5ranx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3E9dGhpcy5hWzVdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMuZmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19CmMudnA9YjtiLnByb3RvdHlwZT17anE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54aTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLnZwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5qcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuQWg9YTt0aGlzLnZpZGVvPWI7dGhpcy5MZD1bXTt0aGlzLnhoPVtdO3RoaXMuTWU9W107dGhpcy5Ndj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLlBrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuQWgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5BaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBnPWUuY29udGVudFdpbmRvdztnLml4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlZ0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLk90LmJpbmQodGhpcyl9O3ZhciBrPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwprLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztnLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7Zy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspO3RoaXMuTGQucHVzaCh7c3JjOmMsZnJhbWU6ZSxtdDpmLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5NZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLk1lW2JdO2MudHlwZT09PWEmJmMueW8odGhpcy5xcShhKSl9fSxxcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntyeDohMCxxeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntleDoidmlkZW8iLHR4OiJqc0N1c3RvbSIsdXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsdng6MSxQdzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEdxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5MZC5sZW5ndGg7YisrKWlmKHRoaXMuTGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5MZFtiXS5tdDtyZXR1cm4iIn0sVnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLkdxKGIpLHZlbmRvcjpifSk7CnRoaXMuRHUoKX0sT3Q6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk12Lm1hcChmdW5jdGlvbihhKXt0aGlzLllmKGEsYil9LmJpbmQodGhpcykpOnRoaXMuWWYoYSxiKX0sWWY6ZnVuY3Rpb24oYSxiKXt0aGlzLk1lLnB1c2goe3R5cGU6YSx5bzpiLG94OiExfSl9LER1OmZ1bmN0aW9uKCl7dGhpcy54aC5tYXAoZnVuY3Rpb24oYSl7YS5Hcnx8KGEuaHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Hcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUGE9Yy5Qa3x8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXM9dGhpcy5hWzNdO3RoaXMudnY9dGhpcy5hWzEwXTt0aGlzLiRvPQp0aGlzLmFbOV07dGhpcy5xbj10aGlzLmFbMV07dGhpcy5Xbj10aGlzLmFbM107dGhpcy5Ibj10aGlzLmFbMV07dGhpcy5hbD10aGlzLmFbOV07dGhpcy5rcD10aGlzLmFbOF07dGhpcy5qdD10aGlzLmFbNV07dGhpcy5Qaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs2XX1jLktrPWI7Yi5wcm90b3R5cGU9e2xzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tczp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnY6dGhpcy5abyhhKX0sWm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRvOnRoaXMucG4oYSl9LHBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xbjp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV246dGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhuOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hbDp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmtwOnRoaXMuaXQoYSl9LGl0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qdDp0aGlzLk9qKGEpfSxPajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLktrfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5scyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmliPWEuQmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5SYj1bXX1jLlZpPWI7Yi5wcm90b3R5cGU9e2dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuZ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6Cihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxJdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFloOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSwKcWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5hZCx0aGlzLmYucygpKX0sWXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5iZCx0aGlzLmYucygpKSl9LGRmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmliLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5JYyYmdGhpcy5mLkljKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPQpiLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWnAodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy52ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSWMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsKInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5SYi5sZW5ndGg7YSsrKXRoaXMuUmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5KaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLldiLmJpbmQodGhpcyksMTApfSxYZjpmdW5jdGlvbihhKXt0aGlzLlJifHwodGhpcy5SYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuUmIucHVzaChhKX0sdmU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5WaXx8WmEsQz1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzddO3RoaXMuRWs9dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzhdO3RoaXMuWWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5Jbj1iO2IucHJvdG90eXBlPXtndjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5odjp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3M6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVrOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGw6dGhpcy5YaShhKX0sWGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgYWI9Yy5Jbnx8YWIsS2M9bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZ3YoNCk7KGZ1bmN0aW9uKGMpe2MuQWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5CZChiKTt0aGlzLm1nKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx5ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYmI9Yy5BbHx8YmI7KGZ1bmN0aW9uKGMpe2Muemw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuUWI9dGhpcy5RYnx8ITE7dGhpcy5QZj10aGlzLlJmPXRoaXMuUmc9dGhpcy5lYT10aGlzLm9mPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuVnAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm9mPSEwO3RoaXMuUmcmJnRoaXMuZ2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuWWMoKTsKdGhpcy5SZz0hMDt0aGlzLmdnKCl9LmJpbmQodGhpcykpO3RoaXMuY2coKX0sZ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5ZYygpO2lmKCF0aGlzLm9mJiYhdGhpcy5ZYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMub2YmJnRoaXMuUGYmJiF0aGlzLlJmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0sWWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApjZzpmdW5jdGlvbigpe2lmKHRoaXMuWWMoKSl7dmFyIGI9dGhpcy5HZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuUGY9Yi5Nd310aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN4KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSx6cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxWcDpmdW5jdGlvbihiLGEpe3RoaXMuUWI9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRjKCl9LmJpbmQodGhpcyksMTAwKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi55ZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLnpxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuemx8fGNiOyhmdW5jdGlvbihjKXtjLkJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkhyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlNsLiRtLlltP3dpbmRvdy5PTy5TbC4kbS5ZbS5LdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnNlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBiYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgY2IoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuVms9dGhpcy5hWzZdO3RoaXMuZXM9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzNdO3RoaXMudHQ9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMua209YjtiLnByb3RvdHlwZT17VWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZrOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lczp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXA6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmI9Yy5rbXx8ZmIsTGM9bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuVWsoNCk7KGZ1bmN0aW9uKGMpe2MuSGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5KZygpfSxKZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVihiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy50aCgpfSx0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuSGl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOwoxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy50YSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnRhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmRnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBoYj1jLkdpfHxoYjsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LHdoOmZ1bmN0aW9uKGIpe2I9bmV3IGdiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaGIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XcHx8KHRoaXMuV3A9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLndoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBpYj1jLklpfHxpYixUPW5ldyBpYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs4XX1jLnZ3PWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYj1jLnZ3fHxqYixNYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5mcig0KTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxJYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuZG18fFU7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuU2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlNjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTXMoYSl9LmJpbmQodGhpcykpO3kuU2MoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5TYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuTnEoKX0sTXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLmNtfHxWOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy50ZCYmKGI9ZS5mcChiLHRoaXMudGQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnRkfHwodGhpcy50ZD1bXSksdGhpcy50ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sU2M6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFZ1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuRmN8fCh0aGlzLkZjPVtdKSx0aGlzLkZjLnB1c2goYiksdGhpcy5YdCgpJiYodGhpcy5YZSgpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxOcTpmdW5jdGlvbigpe2lmKHRoaXMuRmMpZm9yKHZhciBiPTA7Yjx0aGlzLkZjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuRmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5WdShiKX19KX0pKGMpO3ZhciBrYj1jLmVtfHxrYix5PW5ldyBrYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlxPXRoaXMuYVsxMF07dGhpcy5Ncj10aGlzLmFbNF07dGhpcy5ibT10aGlzLmFbMl07dGhpcy55cD10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbM107dGhpcy5Cbj10aGlzLmFbMTBdO3RoaXMuJG49CnRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzJdfWMudm89YjtiLnByb3RvdHlwZT17aHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYm06dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlwOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zczp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm46dGhpcy5abihhKX0sWm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy4kbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYj1jLnZvfHxsYixOYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaHEoNCk7KGZ1bmN0aW9uKGMpe2MuRGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxKYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLkRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5FaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5FaXx8bmI7KGZ1bmN0aW9uKGMpe2MuRmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgbWIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgbmIoZSx0aGlzLkkpKS5nKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5GaXx8b2IscGI9bmV3IG9iKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJsPXRoaXMuYVszXTt0aGlzLm1yPXRoaXMuYVsyXTt0aGlzLnhqPXRoaXMuYVsxXTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs5XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLkZzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLnd2PWI7Yi5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuUmw6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1yOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXE6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkpzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWI9Yy53dnx8cWIsT2M9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUWwoNCk7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5WKGIpO3RoaXMuWihhKTt0aGlzLk50KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMub2x8fHJiOyhmdW5jdGlvbihjKXtjLm5sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpO3RoaXMuZ2k9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZ2kmJih0aGlzLkcoKSx0aGlzLmdpPSEwLHRoaXMucmEoKSk7YS5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgc2I9Yy5ubHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyByYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBzYihjLAp0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHRiPWMucGx8fHRiLFc9bmV3IHRiKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmh3PXRoaXMuYVsyXTt0aGlzLlB2PXRoaXMuYVs0XTt0aGlzLnhyPXRoaXMuYVs0XTt0aGlzLm1qPXRoaXMuYVs5XTt0aGlzLlByPXRoaXMuYVsxXTt0aGlzLmZ1PXRoaXMuYVs2XTt0aGlzLlJrPXRoaXMuYVs3XTt0aGlzLlNwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuWnU9YjtiLnByb3RvdHlwZT17Z3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh3OnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qdjp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHI6dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1qOgp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ1OnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sazp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB1Yj1jLlp1fHx1YixQYz1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5ndyg0KTsoZnVuY3Rpb24oYyl7Yy5KbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxMYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy5KbXx8dmI7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEx0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9W10pO3RoaXMuYWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnRhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnlhP3RoaXMuTHQodGhpcy55YSk6KHRoaXMueWE9dGhpcy5WYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnlhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMucmMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuYWImJnRoaXMuYWIubGVuZ3RoJiYxPHRoaXMuYWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5hYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuYWJbYV0mJjMwMyE9dGhpcy5hYlthXSYmNDAzIT10aGlzLmFiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy50YSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5JbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB2YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHdiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB4Yj1jLkttfHwKeGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVs1XTt0aGlzLnZuPXRoaXMuYVs3XTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnV3PXRoaXMuYVsxXTt0aGlzLlJuPXRoaXMuYVs1XTt0aGlzLkl0PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuQ209YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFwOnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYXQ6dGhpcy50dyhhKX0sdHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51dzp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm46dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkl0Ogp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHpiPWMuQ218fHpiLFFjPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLlBwKDQpOyhmdW5jdGlvbihjKXtjLlhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlJlPSExfSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy54dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHh0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlJlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlJlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEV1OmZ1bmN0aW9uKCl7dGhpcy5SZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuWGx8fEFiOyhmdW5jdGlvbihjKXtjLldsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5pYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ocz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5ocz8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuV2x8fEJiOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBCYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIENiPWMuWWx8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdj10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNF07dGhpcy5Mcz10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbN107dGhpcy5Daz10aGlzLmFbM107dGhpcy5icD10aGlzLmFbMV07dGhpcy5udj10aGlzLmFbMl07dGhpcy5Zbz10aGlzLmFbN107dGhpcy5Scj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLmptPWI7Yi5wcm90b3R5cGU9CntrdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubHY6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVyOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mczp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNrOnRoaXMuYXAoYSl9LGFwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5icDp0aGlzLm12KGEpfSxtdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnY6dGhpcy5YbyhhKX0sWG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllvOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBFYj1jLmptfHxFYixSYz1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5VbHx8RmI7KGZ1bmN0aW9uKGMpe2MuVGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5TbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmtkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5XcigpOnRoaXMuZmcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxTbzpmdW5jdGlvbigpe3RoaXMuTmYoKXx8dGhpcy5tKCEwKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtkKCk7IWIubmEmJmIuWCYmYi5KdyYmYi5MdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMua2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sa2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5vaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMub2g9YltjXSk7cmV0dXJuIHRoaXMub2h9LApkeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5rZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBGYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEdiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEhiPWMuVmx8fEhiLEliPW5ldyBIYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdj10aGlzLmFbM107dGhpcy5taz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxMF19Yy5XaT1iO2IucHJvdG90eXBlPXtwdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXY6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgSmI9Yy5XaXx8SmIsU2M9bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ClNjLnB2KDQpOyhmdW5jdGlvbihjKXtjLklrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sYng6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxKYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPQpjLklrfHxYOyhmdW5jdGlvbihjKXtjLkhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlNlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuU2U9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5TZSYmYiE9dGhpcy5TZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLnphKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS5qeCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmCih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhrfHxZOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5YZSgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxLYj1jLkprfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV0PXRoaXMuYVs2XTt0aGlzLlJqPXRoaXMuYVs2XTt0aGlzLmNqPXRoaXMuYVs2XTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbMl07dGhpcy5xcj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5mcz1iO2IucHJvdG90eXBlPXtEdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXQ6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Sajp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY2o6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmp2OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Uazp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTW46dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTWI9Yy5mc3x8TWIsVGM9bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuRHQoNCk7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGd4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuemp8fE5iOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5PbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIE9iPWMueWp8fE9iOyhmdW5jdGlvbihjKXtjLkFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE5iKGJbYV0pO2MubWF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IE9iKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTsKdmFyIFBiPWMuQWp8fFBiLFFiPW5ldyBQYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ZcD10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbN107dGhpcy5UbT10aGlzLmFbNF07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Ddz10aGlzLmFbNV07dGhpcy5TcT10aGlzLmFbMl07dGhpcy5Vcz10aGlzLmFbMTBdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtYcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlFzOnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5UbTp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmk6dGhpcy5CdyhhKX0sQnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/CnRoaXMuQ3c6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNxOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Vczp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmI9Yy5zanx8UmIsVWM9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuWHAoNCk7KGZ1bmN0aW9uKGMpe2MuUW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT0KYS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlYoYSl9ZWxzZSB0aGlzLmNhKCl9LE10OmZ1bmN0aW9uKCl7dGhpcy5PZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuT2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk9kfHwodGhpcy5PZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LApKYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFNiPWMuUW18fFNiOyhmdW5jdGlvbihjKXtjLlBtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFF0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMudmMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy52YyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLnZjKGEpfS5iaW5kKHRoaXMpKX0sdmM6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LEpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy52Yyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5RdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLkpmKCk7dGhpcy5QdCgpfSxQdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsZnVuY3Rpb24oYil7dGhpcy52YyhiKX0uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuS3Q9ITB9fSl9KShjKTt2YXIgVGI9Yy5QbXx8VGI7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFRiKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFViPWMuUm18fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3Y9dGhpcy5hWzVdO3RoaXMua3I9dGhpcy5hWzldO3RoaXMuRm49dGhpcy5hWzhdO3RoaXMua2s9CnRoaXMuYVs4XTt0aGlzLkJpPXRoaXMuYVs2XTt0aGlzLlh1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVs3XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmZxPWI7Yi5wcm90b3R5cGU9e3J2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zdjp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3I6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZuOnRoaXMuamsoYSl9LGprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5razp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQmk6dGhpcy5XdShhKX0sV3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlh1OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdDp0aGlzLk1tKGEpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5mcXx8V2IsVmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMucnYoNCk7KGZ1bmN0aW9uKGMpe2MudW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5yaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LApQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucmgmJih0aGlzLnJoPSEwLHRoaXMuVyYmdGhpcy5XKCkpfX0pfSkoYyk7dmFyIE89Yy51bXx8TzsoZnVuY3Rpb24oYyl7Yy50bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy5DYnx8KHRoaXMuQ2I9MCksdGhpcy5DYisrLDE1PHRoaXMuQ2Ipe2lmKHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnlhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnRtfHxQOyhmdW5jdGlvbihjKXtjLnZtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLlRhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj0KbmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuWGUoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBYYj1jLnZtfHwKWGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV3PXRoaXMuYVsxMF07dGhpcy54bz10aGlzLmFbM107dGhpcy5VaT10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbM107dGhpcy5sbD10aGlzLmFbMV07dGhpcy51cj10aGlzLmFbOV07dGhpcy5MbD10aGlzLmFbNl07dGhpcy56bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLll1PWI7Yi5wcm90b3R5cGU9e0R3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG86dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zcDp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGw6dGhpcy50cihhKX0sCnRyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy55bShhKX0seW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgWmI9Yy5ZdXx8WmIsV2M9bmV3IFpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9V2MuRHcoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSk7YSYmdGhpcy5WKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5xa3x8WjsoZnVuY3Rpb24oYyl7Yy5waz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkRjPXRoaXMueWE9dGhpcy5VYz0hMTt0aGlzLnZoPWUuR2IoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9CmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuT2crKztpZigxMDx0aGlzLk9nKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fAotMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTsKYnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy50YSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLnBrfHxhYTsoZnVuY3Rpb24oYyl7Yy5yaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9CjA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciAkYj1jLnJrfHwkYixhYz1uZXcgJGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzFdO3RoaXMudms9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdO3RoaXMuZ3Q9dGhpcy5hWzJdO3RoaXMuR3A9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMl19Yy53cD1iO2IucHJvdG90eXBlPQp7cG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFvOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52azp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHM6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmd0OnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJjPWMud3B8fGJjLFhjPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLnBvKDQpOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLAphPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLnVqfHxjYzsoZnVuY3Rpb24oYyl7Yy50aj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMudGp8fApkYzsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubWEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBkYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGVjPWMudmp8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbD10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbMl07dGhpcy5ibz10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbNV07CnRoaXMuQm09dGhpcy5hWzNdO3RoaXMueG49dGhpcy5hWzRdO3RoaXMuTWs9dGhpcy5hWzhdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMucXA9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5Vaj1iO2IucHJvdG90eXBlPXtHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5JcShhKX0sSXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpxOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm86dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG46dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1rOnRoaXMuTWooYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Oajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLnFwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgZ2M9Yy5Vanx8Z2MsWWM9bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuR2woNCk7KGZ1bmN0aW9uKGMpe2Muamk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5WKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBoYz1jLmppfHxoYzsoZnVuY3Rpb24oYyl7Yy5paT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLAoxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgaWM9Yy5paXx8aWM7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxZYTpmdW5jdGlvbihiKXtiPW5ldyBoYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGljKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLllhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5ZYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYz1jLmtpfHxqYyxrYz1uZXcgamMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ1PXRoaXMuYVsyXTt0aGlzLnJsPXRoaXMuYVs4XTt0aGlzLlpqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMucnc9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5idTp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucmw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgbGM9Yy5yd3x8bGMsWmM9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuYXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9CnRoaXMuYWg9dGhpcy4kZz0hMTt0aGlzLndkPVtdO3RoaXMuV2U9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBZYj9udWxsOlliLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuT2w9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5BcShhKTpbXSxiO3RoaXMuYWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuJGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuQ2goYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLlpnKWJyZWFrOwpiPXRoaXMuV2VbY107dGhpcy5yZihiKSYmKHRoaXMud2QucHVzaChiKSx0aGlzLkNoKGIpKX19LHJmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5yZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxDaDpmdW5jdGlvbihhKXt0aGlzLnJmKGEpJiZhLmcoKX0sR3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHQmJiF0aGlzLiRnKWZvcih0aGlzLlpnPSEwLGE9MDthPHRoaXMud2QubGVuZ3RoO2ErKyl0aGlzLndkW2FdLktiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2RbYV0uS2IpfX19KShjKTt2YXIgbWM9Yy5PbHx8bWMsTT1uZXcgbWM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLlhqPXRoaXMuYVsxMF07dGhpcy5Pcz10aGlzLmFbNl07dGhpcy5HdD10aGlzLmFbMV07dGhpcy52dD10aGlzLmFbNV07dGhpcy5jcT10aGlzLmFbMTBdO3RoaXMuQ3A9dGhpcy5hWzEwXTt0aGlzLlhxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuWnM9YjtiLnByb3RvdHlwZT17S286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxvOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yajp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3M6dGhpcy5GdChhKX0sRnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HdDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNxOnRoaXMuQnAoYSl9LEJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ3A6dGhpcy5XcShhKX0sCldxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYz1jLlpzfHxuYywkYz1uZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5Lbyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueWMoay5DdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueWMoay5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBhZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHFjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS55cigpLHtpZDpiZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuTm89dGhpcy5hWzZdO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsxXTt0aGlzLm90PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVs2XTt0aGlzLkRzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTG09YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhtOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMud3M6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmRrOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTm86dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5obDp0aGlzLktqKGEpfSxLajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGo6dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm90OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Hazp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWGs6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5MbXx8b2MsY2Q9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLldtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zaD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMucmQ9MDt0aGlzLiRhPSIiO3RoaXMueGQ9W107dGhpcy55ZD0wO3RoaXMudWg9ITE7dGhpcy5UZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5saT1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLnNoPWF9LGJmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxpdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy4kYV1bYV0pOwpyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oYSxiKXtlLnphKCJ3ZWx0LmRlIikmJmUuWmEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy56cigpKXRoaXMubGIubCh0aGlzLmxiLm1kLHRoaXMubGIuRGEsdGhpcy5sYi5WZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLnhjKTtlbHNlIGlmKHRoaXMuUHEoKSl0aGlzLmN1KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmUudihrLmFkLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5JdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFFhKGwsdGhpcy5sYixnKTtsLmh1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5ncyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuRWgobCl9fSx6cjpmdW5jdGlvbigpe3ZhciBhPQpuZXcgRGF0ZSxiPTA7aWYodGhpcy5yZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnJkLmdldFRpbWUoKSx0aGlzLnJkPWEsM0U1PGI/ITA6ITE7dGhpcy5yZD1hO3JldHVybiExfSx6dTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmFmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5GYSgiYWRUYWciKTt0aGlzLkZhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5GYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMucmcoYSkpP3RoaXMuSmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX0seXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuYWYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLm91KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5yZyhjKSk/dGhpcy5KYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX19LHJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxUdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnN1KHRoaXMueXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTGEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuYWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuSmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuYmQsdGhpcy5wbGF5ZXIucygpKSl9fSxTdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm51KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSWUoKX0sZzpmdW5jdGlvbigpe3RoaXMuenUoKTt0aGlzLnBsYXllci5JZSYmdGhpcy5TdCgpO3RoaXMuVHQoKX0sVXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy54ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMud3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLAphW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy55ZD10aGlzLnhkLmxlbmd0aH0sUHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMueWQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy51aD1hO2ZvcihhPTA7YTx0aGlzLnhkLmxlbmd0aDthKyspdGhpcy54ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkJ0LmJpbmQodGhpcykpfSxCdDpmdW5jdGlvbihhKXt0aGlzLnlkLS07YSYmdGhpcy5UZS5wdXNoKGEpOzA+PXRoaXMueWQmJnRoaXMudWgoKX0sZ3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVGUubGVuZ3RoO2MrKyliPXRoaXMuVGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMubGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm9pPXRoaXMuYVs2XTt0aGlzLlZyPXRoaXMuYVsxMF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubnc9dGhpcy5hWzVdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMua3c9dGhpcy5hWzFdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMub209dGhpcy5hWzFdO3RoaXMudXM9dGhpcy5hWzhdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5ycz1iO2IucHJvdG90eXBlPXtuaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2k6dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZyOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qajp0aGlzLmx3KGEpfSxsdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnc6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF2OnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5rdzp0aGlzLnh3KGEpfSx4dzpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnl3OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vbTp0aGlzLnRzKGEpfSx0czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXM6dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5yc3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQubmkoNCl9KS5jYWxsKGNlaVF1YWVmaGFpQnV4YWUsY2VpUXVhZWZoYWlCdXhhZSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.219.73.88
Frankfurt am Main, Germany,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- s3.eu-central-1.amazonaws.com
- Software
-
AmazonS3 /
- Resource Hash
- f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
|
GET
H2
|
200
|
giga-ssl.json
Show response
videos.giga.de/homad/
Frame 4650
|
265 B
436 B
|
33ms
32ms
|
XHR
application/json |
109.71.25.30
HGCOMP-ASN
|
|
General
- Full URL
- https://videos.giga.de/homad/giga-ssl.json?cache=3723327898
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGNlaVF1YWVmaGFpQnV4YWU9Y2VpUXVhZWZoYWlCdXhhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5aYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5zbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5hZCxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlJhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuYmYoYyk7YS5qdShsKTthLml1KG0pO2EuVXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkliLmxlbmd0aCl7dmFyIGE9bC5JYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG49dGhpcy5hWzZdO3RoaXMuTHA9dGhpcy5hWzZdO3RoaXMueG09dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5IcD1iO2IucHJvdG90eXBlPXtDbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG46dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSHB8fGhhLHJjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zbz0hMTt0aGlzLlhiPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQXQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLk5nPXt9O3RoaXMuWmU9ITF9Yy5Gaj1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LEFjOmZ1bmN0aW9uKCl7dGhpcy5aZXx8KHRoaXMuWmU9ZS5hYSgxMCkpO3JldHVybiB0aGlzLlplfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuTmdbYV0mJih0aGlzLk5nW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLAp0aGlzLkh1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnp0KGEuZGF0YSl9LAp6dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LGxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudHEoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmVoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KbmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sa246ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy52YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmVxKGEpKXJldHVybjsoYj10aGlzLmxnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT0KYX19LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxmYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHNlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sQ2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6CiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxKaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxXZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LHplOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCwKZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOwowPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZShhKX0uYmluZCh0aGlzKSwxMDApfSxHYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDwKYTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9CjA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHQucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLQo4XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt4PWs7dT1sO3I9bTtmb3IoZj0wOzE5Pj1mO2YrKylwPWQocSw1KSsobiZ4fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrCmIoZykrYihrKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7CnJldHVybiBifSxGcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5SYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxTYTpmdW5jdGlvbigpe3ZhciBhPXtDaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxacTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSwKQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEFrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxobzpmdW5jdGlvbigpe3JldHVybiBhLkNpKCl8fGEuSmkoKXx8YS5acSgpfHxhLkNsKCl8fGEuT20oKXx8YS5BaygpfHxhLiRsKCl9fTtyZXR1cm4gbnVsbCE9YS5obygpfSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEJjOmZ1bmN0aW9uKGEpe2E9dGhpcy52YShhKS5ob3N0LnNwbGl0KCIuIik7CnZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LENxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudmEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxmcDpmdW5jdGlvbihhLApiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sQ3U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuWGgoYikrIjoiK3RoaXMuWGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxhZjpmdW5jdGlvbihhKXt0aGlzLlhiPQphfSx2ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlhiO3RoaXMuVmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHljOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLllhKGIsZCkpO2ImJihCPWsuWWEoYSxiKSk7ZiYmKEI9ay5ZYShCLGYpKTtxJiYoQj1rLllhKEIscSkpO2MmJihCPWsuWWEoQixjKSk7ZyYmKEI9ay5ZYShCLGMpKTtlLnljKEIpfSxDdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmCjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTtiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DdChhKTtpZihiKWlmKCFsfHwKIWwuWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuemQoKTtsLnhhKGEsITApO2E9bC54YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pOwp0aGlzLk1jW2ZdfHwodGhpcy5NY1tmXT0wKTt0aGlzLk1jW2ZdKys7MTA8dGhpcy5NY1tmXXx8KGY9bC56ZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC54YShmLCEwKSxmPWwueGEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsCihmWzBdP2ZbMF06IiIpKyhmWzFdP2ZbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sR2U6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuRm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxxZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMua2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmxkKGEpOiIifSxsZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSwKYixkLGYpe2Q9ITE7aWYoYi5CZShhKXx8dGhpcy5KcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LlllJiZ3aW5kb3cuc2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7CmQmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLlphKGEsYi5IYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5vZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5rbihlLGEpO3JldHVybiBlfSxaYTpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godGMpe2ModGMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7CmVsc2V7bS54YShhLGUpO2U9bS54YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uSWEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYKMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LCRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLktjKWZvcih2YXIgYyBpbiB0aGlzLktjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuS2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKToKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYSxmLkhhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy4kcihmLm9kKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LYz1hfSx3dzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuWmEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTsKZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0saW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxEcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5Ganx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Faj1iO2IuWWE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnB0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLk1wPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iuc3c9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5MZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuUWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuVWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmNuPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkh2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaGc9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Vbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmJkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuYWQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlNmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5lbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUmM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLldkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLllkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuZG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmRpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuQnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5zZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi5wZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuaWc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmN3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkR2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIuRXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkN2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpO3ZhciBrPWMuRWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnc9dGhpcy5hWzhdO3RoaXMuZW89dGhpcy5hWzNdO3RoaXMudGk9dGhpcy5hWzRdO3RoaXMuVGo9dGhpcy5hWzhdO3RoaXMubW09dGhpcy5hWzldO3RoaXMuY3I9CnRoaXMuYVsyXTt0aGlzLnNyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLnJuPWI7Yi5wcm90b3R5cGU9e2V3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mdzp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZW86dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50aTp0aGlzLlNqKGEpfSxTajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVGo6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1tOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jcjp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLnJufHxqYSx1Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuZXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Haj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHhxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lKwpuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxqZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuamQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5qZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudWUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5qZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sVGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLnhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuamQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuR2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXc9dGhpcy5hWzNdO3RoaXMuQXA9dGhpcy5hWzJdO3RoaXMuYXY9dGhpcy5hWzEwXTt0aGlzLnZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs0XX1jLmR1PWI7Yi5wcm90b3R5cGU9e3p3OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuQXc6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFwOnRoaXMuJHUoYSl9LCR1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmR1fHxrYSx2Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy56dyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuUWk9Yn0pKGMpO3ZhciBMPWMuUWl8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGk9dGhpcy5hWzddO3RoaXMuaGo9dGhpcy5hWzEwXTt0aGlzLnpuPXRoaXMuYVs0XTt0aGlzLnJpPQp0aGlzLmFbOV07dGhpcy5Ucj10aGlzLmFbOV07dGhpcy50bj10aGlzLmFbMTBdO3RoaXMuT2s9dGhpcy5hWzNdO3RoaXMua289dGhpcy5hWzVdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuS249dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy53bD1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTGk6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhqOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bjp0aGlzLnBpKGEpfSxwaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucmk6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRyOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG46dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmtvOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jdDp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLndsfHxsYSx3Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuS2E9e307dGhpcy5JPW51bGw7dGhpcy5IYz0xMDA7dGhpcy5IYj0wO3RoaXMuVGE9MTUwO3RoaXMuS2I9MDt0aGlzLmt1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYT8odGhpcy5IYisrLHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuSGMpKTowPnRoaXMuVGEmJih0aGlzLktiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IYj50aGlzLlRhPyEwOiExfSxYZTpmdW5jdGlvbigpe3RoaXMuSGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGt1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5LYVtiLmphKCldPWI7TSYmTS5haCYmTS5HdShiKX0sV3c6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZSh0aGlzLkthKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9LEVyOmZ1bmN0aW9uKGIpe2I9Yi5HYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkthKWlmKGIuaWQ9PQp0aGlzLkthW2FdLkdhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG54OmZ1bmN0aW9uKGIpe3RoaXMuS2FbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBwPWMuTmx8fHA7KGZ1bmN0aW9uKGMpe2MuUGw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5IYz0xMDt0aGlzLkhiPTA7dGhpcy5UYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLm5nPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuR2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTGE6ZnVuY3Rpb24oKXt9LApzdTpmdW5jdGlvbihiKXt0aGlzLlc9Yn0sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XfSxudTpmdW5jdGlvbihiKXt0aGlzLkplPWJ9LFZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmV9LEllOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYSYmKHRoaXMuSGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkhjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHB4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlFxKCl8fHRoaXMuZm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxKYTpmdW5jdGlvbigpe3JldHVybiExfSxmeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEljOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRWg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSx6aDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sJHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGt4OmZ1bmN0aW9uKCl7dGhpcy5uZ3x8KHRoaXMubmc9ITApfSxwZTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5QbHx8dDsoZnVuY3Rpb24oYyl7Yy5taT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkhmPSIxIjt0aGlzLklmPSIyIjt0aGlzLlptPSIzIjt0aGlzLk9jPTA7dGhpcy5paD0KMzA7dGhpcy5QYj1bXTt0aGlzLmdiPVtdO3RoaXMubWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuV2Y9dGhpcy4kaD0hMTt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5iZihiKTt0aGlzLmx1KGEpfSxnOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3RoaXMuJGh8fCh0aGlzLiRoPSEwLGUuR2UoKSl9LE5lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5ZYiYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9CmUuQWMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLkFjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT0xfSxCcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldLmluaXRpYXRvciE9ZS5BYygpJiYodGhpcy5jZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnVhKCkpe3RoaXMudnIoKTtpZighdGhpcy5CcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5jZigpO3JldHVybn10aGlzLmNmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5UaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLAphKXt0aGlzLnVhKCl8fCh0aGlzLlBiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sVGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1lLnVuaXF1ZSh0aGlzLlBiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5tY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm1jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMubWNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLApiLCEwLGEpfX0sWnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSGZ9LGNmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0scXU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlptfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuT2N9LE5mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkhmfSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5JZn0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuT2N9LGJmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sbHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LHZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sY3M6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLm1pfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbN107dGhpcy5KbD10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMTBdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuZXA9YjtiLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zbjp0aGlzLklsKGEpfSxJbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkpsOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tcDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc206dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFxOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7CnZhciBuYT1jLmVwfHxuYSx4Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Ybig0KTsoZnVuY3Rpb24oYyl7Yy5waj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5wanx8b2E7KGZ1bmN0aW9uKGMpe2MucWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLkl3O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMucWp8fHBhOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLnJqfHxxYTsobmV3IHFhKHIpKS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm1sPWI7Yi5wcm90b3R5cGU9e2hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLm1sfHxyYSx5Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ocig0KTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3RoaXMuc2coKTt0aGlzLnVnKCk7dGhpcy5Ubz0hMX0sc2c6ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuWmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5aYil7dmFyIGI9dGhpcy5HYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuWmI9ITApO3RoaXMuWihhKX19LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sSWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkplJiYoMCx0aGlzLkplKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5oa3x8c2E7KGZ1bmN0aW9uKGMpe2MuZ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuWGQ9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5QYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJgohdGhpcy51YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMucmEoKSx0aGlzLmdldFBsYXllcigpLlRvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS52ZCgpLGEua2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUGM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5OZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlFjLmluZGV4T2YoYSkmJgp0aGlzLlFjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5RYy5sZW5ndGg+PXRoaXMuWGQmJnRoaXMubSgpKX0sY3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5uZT90aGlzLm5lKys6dGhpcy5uZT0xOnRoaXMubWU/dGhpcy5tZSsrOnRoaXMubWU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSmgoYS52aWRlb1RhZyk/YS5aYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlBjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuWmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5na3x8dGE7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ycSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkVyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sVHc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnJxOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5pa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVqPXRoaXMuYVsyXTt0aGlzLnh1PXRoaXMuYVs2XTt0aGlzLnprPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMuVW49YjtiLnByb3RvdHlwZT17ZGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVqOnRoaXMud3UoYSl9LHd1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54dTp0aGlzLnlrKGEpfSx5azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuems6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlVufHx3YSx6Yz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuZGooNCk7KGZ1bmN0aW9uKGMpe2MuR209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVihhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0KYi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuVyYmdGhpcy5XKCl9LHllOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0scWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLkdtfHx4YTsoZnVuY3Rpb24oYyl7Yy5GbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRGM9dGhpcy55YT10aGlzLlVjPSExO3RoaXMudmg9ZS5HYigxMCk7dGhpcy5aaD0hMDt0aGlzLnJjPXRoaXMuUWc9ITE7dGhpcy54cyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLkNvKCksdGhpcy5xYigpKX0seHM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuemEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5YLCI7Iix0eXBlb2YgYi5YLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlg/Yi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5YP3R5cGVvZiBiLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRWE/Yi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5FYT90eXBlb2YgYi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLkVhP2IuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouRWE/dHlwZW9mIGIuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouVWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRGN9LENyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQXIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlVjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5VYz0hMCk7cmV0dXJuIHRoaXMuVWN9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5WYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5SdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LFJ0OmZ1bmN0aW9uKCl7dGhpcy5yYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGUuemEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sU3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSwKQ286ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxkZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlkpaG9tYWRVdGlscy5SYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkNyKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuVmIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuVmIoKSx0aGlzLnJjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMudygpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuVmIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5CYSgpO2JyZWFrfX0sRG86ZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy53Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMud2MhPWIuYWRzLnN0YXRlJiYodGhpcy53Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy53Yyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLndjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EbygpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQmE6ZnVuY3Rpb24oKXswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMudWEoKXx8KGJ8fCh0aGlzLlpoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLlpoLGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxJbzpmdW5jdGlvbigpe3RoaXMuYXh8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuUXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5XdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxXdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5GbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuS2god2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLktoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LEtoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnNlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubWF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgemE9Yy5IbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRrPXRoaXMuYVs0XTt0aGlzLmZrPXRoaXMuYVs0XTt0aGlzLnF3PXRoaXMuYVsxXTt0aGlzLnZsPXRoaXMuYVsyXTt0aGlzLnZ1PXRoaXMuYVs5XTt0aGlzLmpsPXRoaXMuYVs0XTt0aGlzLkJ1PXRoaXMuYVs1XTt0aGlzLm9qPXRoaXMuYVs0XTt0aGlzLkNqPQp0aGlzLmFbNF07dGhpcy5nbT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLlppPWI7Yi5wcm90b3R5cGU9e3NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50azp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZms6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnF3OnRoaXMudWwoYSl9LHVsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bDp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnU6dGhpcy5pbChhKX0saWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpsOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2o6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMuZm0oYSl9LGZtOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuZ206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5aaXx8QmEsQWM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuRWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5QZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sd3Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMuamEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuWWImJigwPD1oLmluZGV4T2YoZCl8fGEudmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlBlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLlBlKys7aWYoMTA8dGhpcy5QZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7CnZhciBDYT1jLkVsfHxDYTsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe2lmKCF0aGlzLm9lKWlmKHRoaXMuQ2J8fCh0aGlzLkNiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuQ2IrKywxNTx0aGlzLkNiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMub2U9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCl9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnlhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5VcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLlVwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2Iud3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuRGx8fERhOyhmdW5jdGlvbihjKXtjLkZsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVGE9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubWF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLkZsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuYm49dGhpcy5hWzhdO3RoaXMub3A9dGhpcy5hWzFdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOV19Yy5FbT1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXA6dGhpcy5hbihhKX0sYW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcDp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLnJ0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5FbXx8R2EsQmM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy55dD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PQpiLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnl0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuZ2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5nZCl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5XZyh0aGlzLmdkKTtlLnplKHRoaXMuZ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLAo1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmFrfHxIYTsoZnVuY3Rpb24oYyl7Yy4kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy4kanx8SWE7KGZ1bmN0aW9uKGMpe2MuYms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5UYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuQ2coYiwiZWxlbWVudElEIik7aWYoZS5XZyhhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5LYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5LYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIEphPWMuYmt8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xcz10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzVdO3RoaXMuUGk9dGhpcy5hWzFdO3RoaXMuJHQ9dGhpcy5hWzNdO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbN119Yy56bz1iO2IucHJvdG90eXBlPXtWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmltOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJHQ6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuem98fExhLENjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLlZzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Iaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxtdTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGduOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuSGp8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5lYj1hO3RoaXMueGc9CnRoaXMuaGk9ITE7dGhpcy5taD1kO3RoaXMuTGg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZWI9bmV3IHooYSkpO3ZhciBjPXRoaXMuc2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJmwmJmwuQ2UodGhpcy5lYi51cmwpJiZsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5tdSgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmthKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LApmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLklqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmViLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLnhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5MaD90aGlzLnNiLm9wZW4odGhpcy5lYi5tZXRob2QsdGhpcy5lYi51cmwsITEpOnRoaXMuc2Iub3Blbih0aGlzLmViLm1ldGhvZCx0aGlzLmViLnVybCwhMCksdGhpcy5oaXx8KHRoaXMuc2Iud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLAphWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5zYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuQ2UodGhpcy5lYi51cmwpP2wuS2Q/bC5rYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5DZSh0aGlzLmViLnVybCksdGhpcy5taCYmdGhpcy5taCgpfXJldHVybiB0aGlzLnNifX19KShjKTt2YXIgTWE9Yy5Janx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJhPSExO3RoaXMudWM9IiI7dGhpcy5jZT10aGlzLnRjPXRoaXMud2I9bnVsbDt0aGlzLmdwPXRoaXMuSWI9dGhpcy5kaD0hMTt0aGlzLkhhPSIiO3RoaXMuWWc9ITE7dGhpcy5EYT10aGlzLm1kPSIiO3RoaXMuVWc9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLktnPXRoaXMuY2M9IiI7dGhpcy5sZT0hMTt0aGlzLm1mPTA7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjsKdGhpcy5BZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuT2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmVjPSIiO3RoaXMuZmM9W107dGhpcy5nYz1bXTt0aGlzLklkPVtdO3RoaXMuZGM9IiI7dGhpcy5uZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNjPSExO3RoaXMuSm89dGhpcy5NZD1udWxsO3RoaXMuR2g9dGhpcy5qYz10aGlzLnBnPXRoaXMucWY9dGhpcy5LZD10aGlzLmZlPXRoaXMuVmQ9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5uZD0wO3RoaXMuTWc9ITE7dGhpcy5MZz0xRTM7dGhpcy5XYz0hMTt0aGlzLk9hPTFFMzt0aGlzLktmPSIifWMuSmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuUmEsCmFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuZGgsc2lkZWxvYWRzOnRoaXMuSWIsZGlzYWJsZXRlc3RzOnRoaXMuZ3AsaG9tYWRBbGlhczp0aGlzLkhhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5ZZyxnbG9iYWxDb25maWc6dGhpcy5tZCxjbGllbnRDb25maWc6dGhpcy5EYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlksaXNCbG9ja2VkOnRoaXMuVWcsc2VydmVyOnRoaXMuQWEsc3ZtQ29uZmlnOnRoaXMuY2MsaG9tYWRBZHBhdGg6dGhpcy5LZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmxlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm1mLEhPTUFEX1ZFUklGSUVEOnRoaXMuQ2YsSE9NQURfQkxPQ0tFRDp0aGlzLkFmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLk9iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmxjLApIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuQmYsdGVzdEhpZGU6dGhpcy5lYyx0ZXN0VGFnczp0aGlzLmZjLHRlc3RUYWdzSlM6dGhpcy5nYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5kYyx0aHJvdHRsZTp0aGlzLm5mLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuQ2MsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlZkLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5mZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5LZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5xZixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5iYixzZXJ2ZXJJZDp0aGlzLkRoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmpjLHNraXBBbGxvd2VkOnRoaXMuR2gsdm1hcHM6dGhpcy5laSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuV2MsYWRGYWxsYmFja1VSTDp0aGlzLktmfX0sCk9xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0sc3E6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLApkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5pbyhhKX0seGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlJhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkJlKGEpO2M9dGhpcy52YShhKTtmPyh0aGlzLnBkKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnpkKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMudWN8fHRoaXMud2J8fHRoaXMudGN8fHRoaXMuY2UpJiYoZz10aGlzLmtzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMudXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PQpnO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLnBkKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxwZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5BYSYmdGhpcy5BYS5sZW5ndGgmJjA8dGhpcy5BYS5sZW5ndGgmJihiPXRoaXMuQWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPQpiLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuQmUoYSk7cmV0dXJuIGJ9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5IYSYmMDx0aGlzLkhhLmxlbmd0aClyZXR1cm4gdGhpcy5IYTtmb3IoZCBpbiB0aGlzLkhhKWlmKGI9dGhpcy5IYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk53O3JldHVybiJub25lIn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BYVt0aGlzLkRoXX0semQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9kKCksYj10aGlzLkZoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLApiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxqczpmdW5jdGlvbihhLGIpe3ZhciBkPWUudmEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEg9MDtIPGcubGVuZ3RoO0grKyl7dmFyIGs9Z1tIXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLmpoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9CnRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxrczpmdW5jdGlvbihhKXt0aGlzLnVjJiYoYSs9dGhpcy51Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy50YyYmKGE9dGhpcy5qcyhhLHRoaXMudGMpKTtyZXR1cm4gYX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bD10aGlzO3RoaXMuWWc9ITA7dGhpcy5tZD1hO3RoaXMuRGE9Yjt0aGlzLlZlPWQ7dGhpcy5NZD1mO3RoaXMueGM9Yzt0aGlzLmJiPWV8fHt9O3RoaXMuWnIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuRGEpdGhpcy5YcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5EYSl0cnl7dGhpcy5EYT0KYigpLHRoaXMuWmMoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFpyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLm1kK3RoaXMuJGQoImdsb2JhbCIpKSx0aGlzLktxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLiRlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuWmMoKX0uYmluZCh0aGlzKSwhMCl9LFhyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLkRhK3RoaXMuJGQoImNsaWVudCIsLTEhPXRoaXMuRGEuaW5kZXhPZigiPyIpKSksdGhpcy5aYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy4kZSgiY2xpZW50Iik7dGhpcy5rYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5HYigpKTt0aGlzLmJiJiZ0aGlzLmJiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5iYiYmdGhpcy5iYi5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGthOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKXt0aGlzLmZlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnhjPSExKTt0aGlzLnhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueGM/dGhpcy54YygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuVWc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkFmKSk7dGhpcy5MYigpO2UueWMoay5wdCk7KGI9ZS5CYyh0aGlzLm9kKCkpKXx8KGI9ZS5CYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sS3E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkRhfHx0aGlzLmNjfHx0aGlzLkhhfHx0aGlzLlpjKCk6KHRoaXMuUmE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLk9iKSksdGhpcy5MYigpKX19LFpjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLkRhfWVsc2UgYT10aGlzLkRhO3RoaXMuaXNFbmFibGVkPXRoaXMuaGMoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLmNjPWEuY29uZmlnfHwiIjt0aGlzLkhhPWEuYWxpYXN8fG51bGw7dGhpcy5LZz1hLmFkcGF0aHx8IiI7dGhpcy5sZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkRoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuY2MmJnRoaXMuSGEmJnRoaXMuQWEubGVuZ3RoP3RoaXMuRWMoITEpOih0aGlzLlJhPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLkxiKCkpfSxFYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLnpkKCkpLGQ9dGhpcy52YSh0aGlzLmNjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuY2MrdGhpcy4kZCgiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMuSnUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuJGUoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMua2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwKMTAwKSk6dGhpcy5FYyghMCl9LmJpbmQodGhpcyksITApfX0sSnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5DYz0hMDt0aGlzLkVjKCEwKTtyZXR1cm59fXRoaXMuS2Q9dGhpcy5oYyhiLnN0cmljdCk7dGhpcy5xZj10aGlzLmhjKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnBnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmhjKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuZWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5nYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy51Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8Cm51bGw7dGhpcy50Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZGg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5JYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1iLnZwYWlkfHwhMTt0aGlzLmJiLnZwYWlkPXRoaXMuamM7dGhpcy5HaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlhjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5laT1iLnZtYXBzfHwiIjt0aGlzLldjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1iLmJpdHJhdGV8fDFFMzt0aGlzLktmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmRjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuQnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmxlJiYodGhpcy5kYz1udWxsKTt0aGlzLm5mPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPQpiLnZpZGVvcGxhemF8fHt9OyF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5DYz0hMCx0aGlzLkVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmJ2KCkmJih0aGlzLmVjfHx0aGlzLmdjfHx0aGlzLmZjfHx0aGlzLmRjfHx0aGlzLklkKT90aGlzLlZlPyh0aGlzLlJhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMuaGUoKSx0aGlzLkxiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5PdSgpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuUHUoKX0sUHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUuZmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMuYmImJnRoaXMuYmIucGxheWVyJiZ0aGlzLmJiLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5rYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLkxiKCl9LExjOmZ1bmN0aW9uKGEpe3RoaXMuVmQ9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLkxiKCksdGhpcy5oZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmVjKXt2YXIgYT1lLmZkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5iaCgpKXRoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5lYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuUGgoKX19ZWxzZSB0aGlzLlBoKCl9LE9oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkdiKCkpO3RoaXMuU3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmpmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MYyh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmZjPXRoaXMuSWQpJiZ0aGlzLmZjLmxlbmd0aCl7dmFyIGQ9dGhpcy5mYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmpmKCl9LFN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxQaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigpKTt0aGlzLlR1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5PaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuZ2MmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZD10aGlzLmdjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuT2goKX0sVHU6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxqZjpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMubWYrKyx0aGlzLklhKG5ldyB6KHRoaXMuZGMpLHRoaXMuTHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5NaCgpfSxrZjpmdW5jdGlvbihhKXt0aGlzLkxjKHRoaXMuQmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxMdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5tZj90aGlzLmpmKCk6dGhpcy5rZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuTWgoKTp0aGlzLmtmKCJBQUEiKX0sTWg6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTsKdGhpcy5MYigpO3RoaXMuaGUoKX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxMYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5TYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlZkJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS56YSgidC1vbmxpbmUuZGUiKXx8ZS56YSgiZ2lnYS5kZSIpfHxlLnphKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmJoKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkNmKSk7dGhpcy5NZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk1kJiZ0aGlzLk1kKCl9LEdvOmZ1bmN0aW9uKCl7aWYodGhpcy5xZiYmCnRoaXMuT3EoKSl7dmFyIGE9dGhpcy5zcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sVGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5uZHx8KHRoaXMubmQ9MCk7dGhpcy5uZCsrO3RoaXMubmQ+dGhpcy5MZyYmIXRoaXMuTWcmJih0aGlzLk1nPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5MZywhMCkpO2E9bmV3IE1hKGEsYixkKTtmJiYoYS5oaT0hMCk7YyYmZS5GcigpJiYoYS54Zz0hMCk7ZyYmKGEuTGg9ITApO3JldHVybiBhLmxvYWQoKX0sRW86ZnVuY3Rpb24oKXtlLlNhKCl8fGUuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmthKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnBkKCl8fChhPXRoaXMudmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZWl9LEZvOmZ1bmN0aW9uKCl7dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkd2LmJpbmQodGhpcyksdGhpcy5Gdi5iaW5kKHRoaXMpKX0sR3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLk9wKCl9LEZ2OmZ1bmN0aW9uKCl7fSxPcDpmdW5jdGlvbigpe2UueWMoay5OcCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5rYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0saGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkliLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkliW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlphKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5pYSgpXT10aGlzO2UuWmEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5uZn0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEdiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0saGM6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEZoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsaCxjO2ZvcihoPTc7MDw9aDtoLS0pYz1hPj4+NCpoJjE1LGQrPWMudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGU9QXJyYXkoODApLGc9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHI9MzI4NTM3NzUyMCxuLHAsdSx0LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj0KYS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGYpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyllW2ZdPXdbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspZVtmXT1kKGVbZi0zXV5lW2YtOF1eZVtmLTE0XV5lW2YtMTZdLDEpO2M9ZztuPWs7cD1sO3U9bTt0PXI7Zm9yKGY9MDsxOT49ZjtmKyspdj1kKGMsNSkrKG4mcHx+biZ1KSt0K2VbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj00MDs1OT49ZjtmKyspdj1kKGMsNSkrKG4mcHxuJnV8cCZ1KSt0K2VbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NjA7Nzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2c9ZytjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7cj1yK3QmNDI5NDk2NzI5NX1yZXR1cm4oYihnKStiKGspK2IobCkrYihtKStiKHIpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5Kanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaXA9CnRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLlprPXRoaXMuYVsxMF07dGhpcy5vbz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs5XX1jLk5yPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLnBzKGEpfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXM6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlwOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ldDp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWms6dGhpcy5ubyhhKX0sbm86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgT2E9Yy5Ocnx8T2EsRGM9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkxxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5QP3RoaXMuJGE9YS5mLlAoKTp0aGlzLiRhPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnZkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuQmguYmluZCh0aGlzKSxtdXRlOnRoaXMuS2UuYmluZCh0aGlzKSx1bm11dGU6dGhpcy50di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVGI9dGhpcy5WYz0hMTt0aGlzLmZvPTFFMzt0aGlzLnBhPW51bGw7dGhpcy5MPWI7dGhpcy5OYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMucm89ZS5hYSgxMCk7dGhpcy5mZj0wO3RoaXMuVGM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5UYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJgooKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuVGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubm49ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5uaD10aGlzLkVkPSExO3RoaXMuZ2g9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLlpkPSExO3RoaXMuV2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5ZYj0hMTt0aGlzLlZvPWUuYWEoMTApO3RoaXMuRmI9ZS5hYSgxMCk7dGhpcy5EYj1lLmFhKDEwKTt0aGlzLkhoPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5qZT10aGlzLmNkPXRoaXMuaGY9dGhpcy5yYj10aGlzLmtjPXRoaXMucGg9dGhpcy5oZD10aGlzLmN2PXRoaXMudWI9dGhpcy5FYj0hMTt0aGlzLnBjPVtdOwp0aGlzLiRiPXt9O3RoaXMuaHQ9MjAwO3RoaXMueGY9dGhpcy55Zj10aGlzLmVlPXRoaXMud2Y9dGhpcy5VZT0hMTt0aGlzLnVkPXt9fWMuRGo9YjtiLnByb3RvdHlwZT17aHU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy4kYV0mJnRoaXMuY29uZlt0aGlzLiRhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuJGFdW2FdKTtyZXR1cm4gYn0sVWg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuWGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLkdkKCJjYWxsIix0aGlzLldhKCkpO2UudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEZlOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMudWI9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlkpdGhpcy5mZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLAp0aGlzLkwuR28oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlJhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlVoKCksbmV3IFModGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuVWgoKSxuZXcgUyh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKToKdGhpcy5QYSgpO2Vsc2V7dmFyIHNjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3NjLkZlKGEsYixkKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7YS5YYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5oZD0hMTt0aGlzLmM9YTt0aGlzLnR1KHRoaXMuYyk7dGhpcy51ZD1uZXcgUGEodGhpcy5jLkl2LHRoaXMudmlkZW8se30pO3RoaXMuSGcoYSk7dGhpcy5wYz10aGlzLnpnKGEpO3RoaXMuUW8oKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5FcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ucShhKSkpOwpyZXR1cm4gY30sbnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LEVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0KMDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlhhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZWQmJmEuZWQuZXJyb3ImJmEuZWQuZXJyb3IuY29kZSYmKGI9YS5lZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk5jLmNvZGU6Yj09Ri5SZC5jb2RlP2UudihrLmR3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSwKdGhpcy5CKCksdGhpcy5DKCkpOihlLkdlKCksYj09Ri5GZi5jb2RlJiZlLnYoay55cyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay5NcCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuR2QoImVtcHR5Iix0aGlzLldhKCkpO3RoaXMuVWEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5HZi5jb2RlOmUudihrLm93LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuc3csdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudihrLnpzLHRoaXMuYy5BLAp0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay5Edix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuemYuY29kZTplLnYoay5Fdix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5VYihhKTt0aGlzLlBhKCl9LFViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgYz1hLk5hLnBvcCgpO3RoaXMuRWUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHR1OmZ1bmN0aW9uKGEpe3RoaXMuamU9ITE7dGhpcy5OYj10aGlzLmIuSzsKdmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuTmIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlVlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXg9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTsKdGhpcy5ubiYmdGhpcy5wbGF5ZXIucGUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnBlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5obihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuVWUmJmIubG9hZCgpO2lmKHRoaXMuUWgoYikpe3RoaXMuR2QoInNldHVwIix0aGlzLldhKCkpO3RoaXMubG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlVlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPQp0aGlzLnBhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUm8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5wYS5hcHBlbmRDaGlsZChiKSx0aGlzLnJ1KCkpOnRoaXMuYy5vcmlnaW4ucWcody5RZCl9LHJ1OmZ1bmN0aW9uKCl7dGhpcy53Zj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmI9ITApO2UuaWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJmUubW4odGhpcy5jLm9yaWdpbi5zYSk7CmUuZmIoInNldFVwVnBhaWQiKTt0aGlzLkdkKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnFoKCk7dGhpcy5iLmRmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5kZigpO3RoaXMucGE9dGhpcy5OYj10aGlzLmIuSzt0aGlzLmFpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5KYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuSHEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmFlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLldiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnBjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuU3YoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5UdigpLHRoaXMuYi5XYighMCksIXRoaXMuTWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuTWI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkFlKHRoaXMuTWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5XYighMCksdGhpcy5YdigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuV2IoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWnYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuJHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5idygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5TYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5oZyx0aGlzLmMuQSwKdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLldjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy55ZiYmKHRoaXMueGY9ITEsdGhpcy5iYygpKSx0aGlzLlZ2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnJiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5KYigibXV0ZWQiLCJ1c2VyIiksZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkpiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnBmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLllkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLmFlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5YZihmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5XZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5rYz0hMH0sVnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMua2M9ITF9LFh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sCld2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlNmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZmIoImltcHJlc3Npb24iKTt0aGlzLkloKCk7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZmIoInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxadjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmhkPSEwO2UuZmIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sJHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpOwplLmZiKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5mYigidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMuc2YoKTtlLmZiKCJjb21wbGV0ZSIpO3RoaXMuVmEoImNvbXBsZXRlIil9LGZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZmIoImFkc3RvcHBlZCIpO3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuaWUoKTsKdGhpcy5IPSExO3RoaXMuUGEoYSl9fSxTdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLmZiKCJlcnIiLGIpO2UudihrLmN3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5maSghMCl9LGhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuUmEmJmIuaXNFbmFibGVkJiYhYi5wZCgpKXt2YXIgZD1iLnZhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsCnRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuTnYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxRaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sbG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuYmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxiaTpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGJ8fHRoaXMudWYoYSl9LmJpbmQodGhpcyksdGhpcy5mbykpfSx1ZjpmdW5jdGlvbihhKXtpZighdGhpcy5WYyYmdGhpcy5RaCh0aGlzLnZpZGVvKSYmIXRoaXMuRWImJiF0aGlzLlRiKXt0aGlzLlZjPSEwO3RyeXtpZighZS5TYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRWJ8fCh0aGlzLkViPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMuS3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5kZigpO3RoaXMuSnYoKTt0aGlzLmFpKCk7dGhpcy5hZygpO3RoaXMuYi5xaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5nZigpfX0sZ2Y6ZnVuY3Rpb24oKXt0aGlzLmNkfHx0aGlzLk1mKCl9LE1mOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuY2R8fChhP3RoaXMuUGEoKToodGhpcy5LZSghMCksdGhpcy5NZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmFjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0uYmluZCh0aGlzKTt0aGlzLnJlKCkuRWgodGhpcyl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5FYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLmNuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5QYSgpfSxQYTpmdW5jdGlvbihhKXtpZighdGhpcy5qZSlpZih0aGlzLmplPQohMCx0aGlzLk5kfHwoZS52KGsuQnMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5uYyl7ZS5vYigibmV3U21hbGxBZElkIik7dGhpcy5mZisrO3RoaXMuVGI9dGhpcy5WYz0hMTt0cnl7dGhpcy5BZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLk5iLnJlbW92ZUNoaWxkKHRoaXMucGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5ZaCgpfWNhdGNoKGcpe310aGlzLmhmPSEwO3RoaXMuYi52ZSgpO3RoaXMuWWI9ITE7dGhpcy5yZSgpLnpoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLkxlKCk7dGhpcy5jLm5jJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5rZSgpKX1lbHNlIHRoaXMua2UoKX0sTnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7CnRoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50ZihhKSl9LHRmOmZ1bmN0aW9uKGEpe3RoaXMuVGI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLkVvKCk7dGhpcy5jLm9yaWdpbi5xZyh3LlFkKX0sY2k6ZnVuY3Rpb24oKXtpZih0aGlzLmN2KXRoaXMuUGEoKTtlbHNle3RoaXMuWWI9ITA7dGhpcy5iLmYuSmEmJiF0aGlzLmhmJiZ0aGlzLmIuZi5KYSgpJiZlLnYoay5hZCx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5mdihhKTtpZighdGhpcy5NYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmCih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5NYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuQWUodGhpcy5NYil9Yz0iIjt0aGlzLmMuZWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGgpKSYmKGM9dGhpcy5jLmVmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSwKdGhpcy5FZHx8KHRoaXMuRWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMudGI/KHRoaXMuVGI9dGhpcy5WYz0hMSx0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5OYi5yZW1vdmVDaGlsZCh0aGlzLnBhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLlloKCksdGhpcy5jLm9yaWdpbi5MZSgpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlRjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlpkPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxWaDpmdW5jdGlvbigpe3RoaXMucGh8fAoodGhpcy5waD0hMCx0aGlzLmhkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sZnY6ZnVuY3Rpb24oYSl7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLldofHx0aGlzLkVifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuVmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZoKCl9LmJpbmQodGhpcykpLHRoaXMuRWJ8fHRoaXMuSWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5WYSgic3RhcnQiKSxlLnYoay5PZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksCnRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5qYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmhkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5RZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLAoidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuV2g9YSl9LEdkOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxJaDpmdW5jdGlvbigpe2UudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLHRoaXMuV2EoKSwhMCl9LFVhOmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX2hkX2FkX2Vycm9yIixhLCEwKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMud2Z8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxKYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkViKXt0aGlzLnVkJiZ0aGlzLnVkLnRyYWNrJiZ0aGlzLnVkLnRyYWNrKGEpOwppZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5GcSh0aGlzLmMuTmEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRHIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5FZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZG4sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKGcudXJsLApnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuY3AodGhpcy5jLk5hLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWUuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLndmJiYoYj0iX3ZwYWlkIik7dGhpcy55ZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxFZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC54YShhKSxjJiZiLmduKGMpLGZ8fChmPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuam4oYSksdGhpcy5MLklhKGIsZnVuY3Rpb24oKXt0aGlzLnloKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGpuOmZ1bmN0aW9uKGEpe3RoaXMuJGJbYV09Im9wZW4ifSx5aDpmdW5jdGlvbihhKXt0aGlzLiRiW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuJGI9e319LEZ1OmZ1bmN0aW9uKCl7dmFyIGE9CjAsYjtmb3IoYiBpbiB0aGlzLiRiKXRoaXMuJGIuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy4kYltiXSYmYSsrO3JldHVybiBhfSxGcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGNwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEt2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mdi5iaW5kKHRoaXMpKX0sTHY6ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmJjKCk6dGhpcy5jLlNiJiYoZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KIl90b3AiO3RoaXMuTC5XYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5TYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuU2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxKdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLAphLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5UYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5YYyYmKGI9dGhpcy5MLlhjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnBhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJgp0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxhaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuVm87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuRmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5TaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuYmMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkRiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ldi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5kdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkhoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmVmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXToKKGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLnBhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5YZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi5xYSYmdGhpcy5iLmYucWEoKSYmKGUudihrLmlnLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5LZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGJjOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLnhmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuUmMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxTaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMua2M/KGUubGEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuSmIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwidXNlciIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMucmI/KGUubGEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sS2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwiY29udGVudCIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx0djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5KYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LGFjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmFjKTt0aGlzLmNkfHx0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0sa2U6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuZmQoKTshdGhpcy5MLmpjfHxlLlNhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5lZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5uaD8odGhpcy5jZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLmpnKCkpOih0aGlzLm5oPXRoaXMueWY9dGhpcy54Zj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKSx0aGlzLmVlPSEwLGE9ZS4kZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5GZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5GdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLHRoaXMuaHQpOih0aGlzLmhmPSEwLHRoaXMuYi52ZSgpLHRoaXMuYi5ZdCgpLHRoaXMuWWI9ITEsZS52KGsuVW8sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnJlKCkuemgoKSl9LHJlOmZ1bmN0aW9uKCl7dmFyIGE9Cm51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxhZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLnplKHRoaXMudmlkZW8sYSk/dGhpcy5CaCgpOnRoaXMudmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5TYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnBjJiYwPHRoaXMucGMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnBjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT0Ke307YS5hZHNlc3Npb25faWQ9dGhpcy5ybysiLSIrdGhpcy5mZjt0aGlzLmMmJnRoaXMuYy5EZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuRGcoKSk7cmV0dXJuIGF9LG9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5Eanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXY9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzZdO3RoaXMuY2w9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5WcT1iO2IucHJvdG90eXBlPXt4djpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXY6dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNpOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuVnF8fApSYSxFYz1uZXcgUmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy54dig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkNhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMub2M9dGhpcy5xYz0hMTt0aGlzLnNhPSIiO3RoaXMudmY9ITE7ZCYmZC5lbXB0eT90aGlzLmJzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuZmQoKSxiO2I9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7CmMmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOmwueGEobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLmxnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT0KY3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC54YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnhhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5hcy5iaW5kKHRoaXMpLHRoaXMuWXIuYmluZCh0aGlzKSl9LApBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5DYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuWGIpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7CnZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuQ2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLlhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5YYnx8dGhpcy5JcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5LdSgpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrCiciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtmW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxJcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmCmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGFzOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMuQ2E9YS5yZXNwb25zZVhNTCx0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuU2QpKX10aGlzLlg9dGhpcy5BZygpO3RoaXMucWM9dGhpcy5sZigpO3RoaXMub2M9dGhpcy5OaCgpOwp0aGlzLlgubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuUWEody5OYyx7ZXJyb3I6dGhpcy52Zj9GLlJkOkYuRWZ9KSl9LGJzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUWEody5TZCkpfXRoaXMuWD10aGlzLkFnKCk7dGhpcy5xYz10aGlzLmxmKCk7dGhpcy5vYz10aGlzLk5oKCk7dGhpcy5YLmxlbmd0aD90aGlzLkdjKCk6dGhpcy5vYSh0aGlzLlFhKHcuTmMse2Vycm9yOnRoaXMudmY/Ri5SZDpGLkVmfSkpfSxZcjpmdW5jdGlvbigpe3RoaXMub2EodGhpcy5RYSh3LkRmLHtkZXB0aDphfSkpfSxHYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLktyKCk/dGhpcy5VdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLklnKCksaCx7QWRTeXN0ZW06dGhpcy5tcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5vYSh0aGlzLlFhKHcuR2YpKTooYT0wLHRoaXMuQnYoKSYmdGhpcy5RZSh0aGlzLldvKCkpKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkdjKCkpOnRoaXMucGFyZW50LkxlKCl9LGtoOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5raCgpfSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ1KCk/dGhpcy5RdSgpPyEwOigtMSE9dGhpcy56YygpP3RoaXMub2EodGhpcy5RYSh3LlBkKSk6dGhpcy5vYSh0aGlzLlFhKHcuemYpKSwhMSk6KHRoaXMub2EodGhpcy5RYSh3Lk5jLEYuRmYpKSwhMSl9LFFlOmZ1bmN0aW9uKGEpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLk5hPWEuTmEuY29uY2F0KHRoaXMuSGUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWGE9CmEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuUWUoYSl9LFdvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLmR1cmF0aW9uPXRoaXMuemMoKTthLk89dGhpcy5GZygpO2EuU2I9dGhpcy5vcSgpO2EuSXY9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5scSgpO2EuZWY9dGhpcy5EcShhLmR1cmF0aW9uKTthLlhhPWEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLlhhPWIuWGE/Yi5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5OYT1iLmVycm9yLmNvZGUhPXcuUGQuY29kZT9iLk5hLmNvbmNhdCh0aGlzLnBxKCkpOmIuTmEuY29uY2F0KHRoaXMueXEoKSkpOwp0aGlzLlgubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5VYiYmdGhpcy5wYXJlbnQuVWIoYiksYT0wLHRoaXMuR2MoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxVYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5VYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUWEoYSxiKSl9LFFhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxSdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy56YygpfSxsZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxOaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMubGYoKSYmKGE9ITApO3JldHVybiBhfSxKdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMudmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sS3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LG1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxIZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0KIkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0seXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sCnBxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxvcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxPdzphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD0KYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5sZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxEcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkN1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubGQoYSk6IiJ9LGxkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9rPXRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVsxMF07dGhpcy5Qbz10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLlRwPWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMub2s6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhrOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qbzp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLlRwfHxVYSxGYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5uayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk5hPVtdO3RoaXMuTz1bXTt0aGlzLlNiPSIiO3RoaXMuQT10aGlzLm5jPXRoaXMudGI9ITE7dGhpcy53ZT10aGlzLm9yaWdpbj1udWxsO3RoaXMueGU9IiJ9Yy5NbD1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx3cTpmdW5jdGlvbigpe2lmKCF0aGlzLndlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkNhKXt2YXIgYT10aGlzLm9yaWdpbi5DYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLndlPWFbY10pfXJldHVybiB0aGlzLndlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueGUpcmV0dXJuIHRoaXMueGU7dmFyIGE9IiI7KGE9dGhpcy53cSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMueGU9YX0sSHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLk1sfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUG49dGhpcy5hWzZdO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuYXI9dGhpcy5hWzVdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5maj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUG46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkpwOnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hcjp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLmZqfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Obig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsCk1hOiJYTUxfUEFSU0VfRVJST1IifSx6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTWE6IkRVUkFUSU9OX0VSUk9SIn0sTmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE1hOiJFTVBUWV9WQVNUIn0sR2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTWE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LERmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsCm1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixNYToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixNYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEZ3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLApNYToiTUVESUFGSUxFX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTWE6IkRVTU1ZX0FEIn19LEY9e0VmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTWE6Ik5PX0FEUyJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixNYToiTk9fTUVESUFGSUxFUyJ9LEd3Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE1hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTWE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19CmMuVmo9YjtiLnByb3RvdHlwZT17bnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Wanx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMubnMoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5lZD1iO3RoaXMuTmE9W107dGhpcy5vcmlnaW49bnVsbH1jLmtqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5ranx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3E9dGhpcy5hWzVdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMuZmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19CmMudnA9YjtiLnByb3RvdHlwZT17anE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54aTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLnZwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5qcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuQWg9YTt0aGlzLnZpZGVvPWI7dGhpcy5MZD1bXTt0aGlzLnhoPVtdO3RoaXMuTWU9W107dGhpcy5Ndj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLlBrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuQWgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5BaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBnPWUuY29udGVudFdpbmRvdztnLml4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlZ0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLk90LmJpbmQodGhpcyl9O3ZhciBrPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwprLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztnLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7Zy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspO3RoaXMuTGQucHVzaCh7c3JjOmMsZnJhbWU6ZSxtdDpmLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5NZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLk1lW2JdO2MudHlwZT09PWEmJmMueW8odGhpcy5xcShhKSl9fSxxcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntyeDohMCxxeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntleDoidmlkZW8iLHR4OiJqc0N1c3RvbSIsdXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsdng6MSxQdzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEdxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5MZC5sZW5ndGg7YisrKWlmKHRoaXMuTGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5MZFtiXS5tdDtyZXR1cm4iIn0sVnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLkdxKGIpLHZlbmRvcjpifSk7CnRoaXMuRHUoKX0sT3Q6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk12Lm1hcChmdW5jdGlvbihhKXt0aGlzLllmKGEsYil9LmJpbmQodGhpcykpOnRoaXMuWWYoYSxiKX0sWWY6ZnVuY3Rpb24oYSxiKXt0aGlzLk1lLnB1c2goe3R5cGU6YSx5bzpiLG94OiExfSl9LER1OmZ1bmN0aW9uKCl7dGhpcy54aC5tYXAoZnVuY3Rpb24oYSl7YS5Hcnx8KGEuaHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Hcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUGE9Yy5Qa3x8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXM9dGhpcy5hWzNdO3RoaXMudnY9dGhpcy5hWzEwXTt0aGlzLiRvPQp0aGlzLmFbOV07dGhpcy5xbj10aGlzLmFbMV07dGhpcy5Xbj10aGlzLmFbM107dGhpcy5Ibj10aGlzLmFbMV07dGhpcy5hbD10aGlzLmFbOV07dGhpcy5rcD10aGlzLmFbOF07dGhpcy5qdD10aGlzLmFbNV07dGhpcy5Qaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs2XX1jLktrPWI7Yi5wcm90b3R5cGU9e2xzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tczp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnY6dGhpcy5abyhhKX0sWm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRvOnRoaXMucG4oYSl9LHBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xbjp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV246dGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhuOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hbDp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmtwOnRoaXMuaXQoYSl9LGl0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qdDp0aGlzLk9qKGEpfSxPajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLktrfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5scyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmliPWEuQmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5SYj1bXX1jLlZpPWI7Yi5wcm90b3R5cGU9e2dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuZ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6Cihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxJdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFloOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSwKcWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5hZCx0aGlzLmYucygpKX0sWXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5iZCx0aGlzLmYucygpKSl9LGRmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmliLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5JYyYmdGhpcy5mLkljKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPQpiLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWnAodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy52ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSWMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsKInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5SYi5sZW5ndGg7YSsrKXRoaXMuUmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5KaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLldiLmJpbmQodGhpcyksMTApfSxYZjpmdW5jdGlvbihhKXt0aGlzLlJifHwodGhpcy5SYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuUmIucHVzaChhKX0sdmU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5WaXx8WmEsQz1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzddO3RoaXMuRWs9dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzhdO3RoaXMuWWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5Jbj1iO2IucHJvdG90eXBlPXtndjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5odjp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3M6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVrOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGw6dGhpcy5YaShhKX0sWGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgYWI9Yy5Jbnx8YWIsS2M9bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZ3YoNCk7KGZ1bmN0aW9uKGMpe2MuQWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5CZChiKTt0aGlzLm1nKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx5ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYmI9Yy5BbHx8YmI7KGZ1bmN0aW9uKGMpe2Muemw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuUWI9dGhpcy5RYnx8ITE7dGhpcy5QZj10aGlzLlJmPXRoaXMuUmc9dGhpcy5lYT10aGlzLm9mPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuVnAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm9mPSEwO3RoaXMuUmcmJnRoaXMuZ2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuWWMoKTsKdGhpcy5SZz0hMDt0aGlzLmdnKCl9LmJpbmQodGhpcykpO3RoaXMuY2coKX0sZ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5ZYygpO2lmKCF0aGlzLm9mJiYhdGhpcy5ZYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMub2YmJnRoaXMuUGYmJiF0aGlzLlJmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0sWWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApjZzpmdW5jdGlvbigpe2lmKHRoaXMuWWMoKSl7dmFyIGI9dGhpcy5HZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuUGY9Yi5Nd310aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN4KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSx6cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxWcDpmdW5jdGlvbihiLGEpe3RoaXMuUWI9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRjKCl9LmJpbmQodGhpcyksMTAwKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi55ZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLnpxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuemx8fGNiOyhmdW5jdGlvbihjKXtjLkJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkhyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlNsLiRtLlltP3dpbmRvdy5PTy5TbC4kbS5ZbS5LdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnNlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBiYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgY2IoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuVms9dGhpcy5hWzZdO3RoaXMuZXM9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzNdO3RoaXMudHQ9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMua209YjtiLnByb3RvdHlwZT17VWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZrOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lczp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXA6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmI9Yy5rbXx8ZmIsTGM9bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuVWsoNCk7KGZ1bmN0aW9uKGMpe2MuSGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5KZygpfSxKZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVihiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy50aCgpfSx0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuSGl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOwoxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy50YSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnRhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmRnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBoYj1jLkdpfHxoYjsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LHdoOmZ1bmN0aW9uKGIpe2I9bmV3IGdiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaGIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XcHx8KHRoaXMuV3A9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLndoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBpYj1jLklpfHxpYixUPW5ldyBpYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs4XX1jLnZ3PWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYj1jLnZ3fHxqYixNYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5mcig0KTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxJYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuZG18fFU7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuU2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlNjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTXMoYSl9LmJpbmQodGhpcykpO3kuU2MoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5TYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuTnEoKX0sTXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLmNtfHxWOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy50ZCYmKGI9ZS5mcChiLHRoaXMudGQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnRkfHwodGhpcy50ZD1bXSksdGhpcy50ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sU2M6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFZ1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuRmN8fCh0aGlzLkZjPVtdKSx0aGlzLkZjLnB1c2goYiksdGhpcy5YdCgpJiYodGhpcy5YZSgpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxOcTpmdW5jdGlvbigpe2lmKHRoaXMuRmMpZm9yKHZhciBiPTA7Yjx0aGlzLkZjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuRmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5WdShiKX19KX0pKGMpO3ZhciBrYj1jLmVtfHxrYix5PW5ldyBrYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlxPXRoaXMuYVsxMF07dGhpcy5Ncj10aGlzLmFbNF07dGhpcy5ibT10aGlzLmFbMl07dGhpcy55cD10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbM107dGhpcy5Cbj10aGlzLmFbMTBdO3RoaXMuJG49CnRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzJdfWMudm89YjtiLnByb3RvdHlwZT17aHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYm06dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlwOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zczp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm46dGhpcy5abihhKX0sWm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy4kbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYj1jLnZvfHxsYixOYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaHEoNCk7KGZ1bmN0aW9uKGMpe2MuRGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxKYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLkRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5FaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5FaXx8bmI7KGZ1bmN0aW9uKGMpe2MuRmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgbWIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgbmIoZSx0aGlzLkkpKS5nKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5GaXx8b2IscGI9bmV3IG9iKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJsPXRoaXMuYVszXTt0aGlzLm1yPXRoaXMuYVsyXTt0aGlzLnhqPXRoaXMuYVsxXTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs5XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLkZzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLnd2PWI7Yi5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuUmw6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1yOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXE6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkpzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWI9Yy53dnx8cWIsT2M9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUWwoNCk7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5WKGIpO3RoaXMuWihhKTt0aGlzLk50KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMub2x8fHJiOyhmdW5jdGlvbihjKXtjLm5sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpO3RoaXMuZ2k9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZ2kmJih0aGlzLkcoKSx0aGlzLmdpPSEwLHRoaXMucmEoKSk7YS5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgc2I9Yy5ubHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyByYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBzYihjLAp0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHRiPWMucGx8fHRiLFc9bmV3IHRiKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmh3PXRoaXMuYVsyXTt0aGlzLlB2PXRoaXMuYVs0XTt0aGlzLnhyPXRoaXMuYVs0XTt0aGlzLm1qPXRoaXMuYVs5XTt0aGlzLlByPXRoaXMuYVsxXTt0aGlzLmZ1PXRoaXMuYVs2XTt0aGlzLlJrPXRoaXMuYVs3XTt0aGlzLlNwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuWnU9YjtiLnByb3RvdHlwZT17Z3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh3OnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qdjp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHI6dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1qOgp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ1OnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sazp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB1Yj1jLlp1fHx1YixQYz1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5ndyg0KTsoZnVuY3Rpb24oYyl7Yy5KbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxMYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy5KbXx8dmI7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEx0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9W10pO3RoaXMuYWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnRhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnlhP3RoaXMuTHQodGhpcy55YSk6KHRoaXMueWE9dGhpcy5WYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnlhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMucmMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuYWImJnRoaXMuYWIubGVuZ3RoJiYxPHRoaXMuYWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5hYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuYWJbYV0mJjMwMyE9dGhpcy5hYlthXSYmNDAzIT10aGlzLmFiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy50YSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5JbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB2YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHdiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB4Yj1jLkttfHwKeGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVs1XTt0aGlzLnZuPXRoaXMuYVs3XTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnV3PXRoaXMuYVsxXTt0aGlzLlJuPXRoaXMuYVs1XTt0aGlzLkl0PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuQ209YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFwOnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYXQ6dGhpcy50dyhhKX0sdHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51dzp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm46dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkl0Ogp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHpiPWMuQ218fHpiLFFjPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLlBwKDQpOyhmdW5jdGlvbihjKXtjLlhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlJlPSExfSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy54dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHh0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlJlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlJlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEV1OmZ1bmN0aW9uKCl7dGhpcy5SZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuWGx8fEFiOyhmdW5jdGlvbihjKXtjLldsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5pYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ocz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5ocz8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuV2x8fEJiOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBCYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIENiPWMuWWx8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdj10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNF07dGhpcy5Mcz10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbN107dGhpcy5Daz10aGlzLmFbM107dGhpcy5icD10aGlzLmFbMV07dGhpcy5udj10aGlzLmFbMl07dGhpcy5Zbz10aGlzLmFbN107dGhpcy5Scj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLmptPWI7Yi5wcm90b3R5cGU9CntrdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubHY6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVyOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mczp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNrOnRoaXMuYXAoYSl9LGFwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5icDp0aGlzLm12KGEpfSxtdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnY6dGhpcy5YbyhhKX0sWG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllvOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBFYj1jLmptfHxFYixSYz1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5VbHx8RmI7KGZ1bmN0aW9uKGMpe2MuVGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5TbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmtkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5XcigpOnRoaXMuZmcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxTbzpmdW5jdGlvbigpe3RoaXMuTmYoKXx8dGhpcy5tKCEwKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtkKCk7IWIubmEmJmIuWCYmYi5KdyYmYi5MdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMua2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sa2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5vaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMub2g9YltjXSk7cmV0dXJuIHRoaXMub2h9LApkeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5rZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBGYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEdiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEhiPWMuVmx8fEhiLEliPW5ldyBIYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdj10aGlzLmFbM107dGhpcy5taz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxMF19Yy5XaT1iO2IucHJvdG90eXBlPXtwdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXY6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgSmI9Yy5XaXx8SmIsU2M9bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ClNjLnB2KDQpOyhmdW5jdGlvbihjKXtjLklrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sYng6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxKYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPQpjLklrfHxYOyhmdW5jdGlvbihjKXtjLkhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlNlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuU2U9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5TZSYmYiE9dGhpcy5TZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLnphKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS5qeCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmCih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhrfHxZOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5YZSgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxLYj1jLkprfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV0PXRoaXMuYVs2XTt0aGlzLlJqPXRoaXMuYVs2XTt0aGlzLmNqPXRoaXMuYVs2XTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbMl07dGhpcy5xcj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5mcz1iO2IucHJvdG90eXBlPXtEdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXQ6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Sajp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY2o6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmp2OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Uazp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTW46dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTWI9Yy5mc3x8TWIsVGM9bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuRHQoNCk7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGd4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuemp8fE5iOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5PbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIE9iPWMueWp8fE9iOyhmdW5jdGlvbihjKXtjLkFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE5iKGJbYV0pO2MubWF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IE9iKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTsKdmFyIFBiPWMuQWp8fFBiLFFiPW5ldyBQYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ZcD10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbN107dGhpcy5UbT10aGlzLmFbNF07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Ddz10aGlzLmFbNV07dGhpcy5TcT10aGlzLmFbMl07dGhpcy5Vcz10aGlzLmFbMTBdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtYcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlFzOnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5UbTp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmk6dGhpcy5CdyhhKX0sQnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/CnRoaXMuQ3c6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNxOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Vczp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmI9Yy5zanx8UmIsVWM9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuWHAoNCk7KGZ1bmN0aW9uKGMpe2MuUW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT0KYS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlYoYSl9ZWxzZSB0aGlzLmNhKCl9LE10OmZ1bmN0aW9uKCl7dGhpcy5PZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuT2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk9kfHwodGhpcy5PZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LApKYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFNiPWMuUW18fFNiOyhmdW5jdGlvbihjKXtjLlBtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFF0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMudmMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy52YyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLnZjKGEpfS5iaW5kKHRoaXMpKX0sdmM6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LEpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy52Yyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5RdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLkpmKCk7dGhpcy5QdCgpfSxQdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsZnVuY3Rpb24oYil7dGhpcy52YyhiKX0uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuS3Q9ITB9fSl9KShjKTt2YXIgVGI9Yy5QbXx8VGI7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFRiKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFViPWMuUm18fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3Y9dGhpcy5hWzVdO3RoaXMua3I9dGhpcy5hWzldO3RoaXMuRm49dGhpcy5hWzhdO3RoaXMua2s9CnRoaXMuYVs4XTt0aGlzLkJpPXRoaXMuYVs2XTt0aGlzLlh1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVs3XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmZxPWI7Yi5wcm90b3R5cGU9e3J2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zdjp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3I6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZuOnRoaXMuamsoYSl9LGprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5razp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQmk6dGhpcy5XdShhKX0sV3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlh1OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdDp0aGlzLk1tKGEpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5mcXx8V2IsVmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMucnYoNCk7KGZ1bmN0aW9uKGMpe2MudW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5yaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LApQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucmgmJih0aGlzLnJoPSEwLHRoaXMuVyYmdGhpcy5XKCkpfX0pfSkoYyk7dmFyIE89Yy51bXx8TzsoZnVuY3Rpb24oYyl7Yy50bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy5DYnx8KHRoaXMuQ2I9MCksdGhpcy5DYisrLDE1PHRoaXMuQ2Ipe2lmKHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnlhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnRtfHxQOyhmdW5jdGlvbihjKXtjLnZtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLlRhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj0KbmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuWGUoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBYYj1jLnZtfHwKWGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV3PXRoaXMuYVsxMF07dGhpcy54bz10aGlzLmFbM107dGhpcy5VaT10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbM107dGhpcy5sbD10aGlzLmFbMV07dGhpcy51cj10aGlzLmFbOV07dGhpcy5MbD10aGlzLmFbNl07dGhpcy56bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLll1PWI7Yi5wcm90b3R5cGU9e0R3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG86dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zcDp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGw6dGhpcy50cihhKX0sCnRyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy55bShhKX0seW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgWmI9Yy5ZdXx8WmIsV2M9bmV3IFpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9V2MuRHcoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSk7YSYmdGhpcy5WKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5xa3x8WjsoZnVuY3Rpb24oYyl7Yy5waz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkRjPXRoaXMueWE9dGhpcy5VYz0hMTt0aGlzLnZoPWUuR2IoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9CmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuT2crKztpZigxMDx0aGlzLk9nKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fAotMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTsKYnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy50YSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLnBrfHxhYTsoZnVuY3Rpb24oYyl7Yy5yaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9CjA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciAkYj1jLnJrfHwkYixhYz1uZXcgJGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzFdO3RoaXMudms9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdO3RoaXMuZ3Q9dGhpcy5hWzJdO3RoaXMuR3A9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMl19Yy53cD1iO2IucHJvdG90eXBlPQp7cG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFvOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52azp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHM6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmd0OnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJjPWMud3B8fGJjLFhjPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLnBvKDQpOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLAphPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLnVqfHxjYzsoZnVuY3Rpb24oYyl7Yy50aj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMudGp8fApkYzsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubWEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBkYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGVjPWMudmp8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbD10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbMl07dGhpcy5ibz10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbNV07CnRoaXMuQm09dGhpcy5hWzNdO3RoaXMueG49dGhpcy5hWzRdO3RoaXMuTWs9dGhpcy5hWzhdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMucXA9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5Vaj1iO2IucHJvdG90eXBlPXtHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5JcShhKX0sSXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpxOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm86dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG46dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1rOnRoaXMuTWooYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Oajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLnFwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgZ2M9Yy5Vanx8Z2MsWWM9bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuR2woNCk7KGZ1bmN0aW9uKGMpe2Muamk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5WKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBoYz1jLmppfHxoYzsoZnVuY3Rpb24oYyl7Yy5paT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLAoxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgaWM9Yy5paXx8aWM7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxZYTpmdW5jdGlvbihiKXtiPW5ldyBoYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGljKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLllhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5ZYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYz1jLmtpfHxqYyxrYz1uZXcgamMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ1PXRoaXMuYVsyXTt0aGlzLnJsPXRoaXMuYVs4XTt0aGlzLlpqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMucnc9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5idTp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucmw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgbGM9Yy5yd3x8bGMsWmM9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuYXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9CnRoaXMuYWg9dGhpcy4kZz0hMTt0aGlzLndkPVtdO3RoaXMuV2U9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBZYj9udWxsOlliLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuT2w9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5BcShhKTpbXSxiO3RoaXMuYWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuJGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuQ2goYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLlpnKWJyZWFrOwpiPXRoaXMuV2VbY107dGhpcy5yZihiKSYmKHRoaXMud2QucHVzaChiKSx0aGlzLkNoKGIpKX19LHJmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5yZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxDaDpmdW5jdGlvbihhKXt0aGlzLnJmKGEpJiZhLmcoKX0sR3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHQmJiF0aGlzLiRnKWZvcih0aGlzLlpnPSEwLGE9MDthPHRoaXMud2QubGVuZ3RoO2ErKyl0aGlzLndkW2FdLktiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2RbYV0uS2IpfX19KShjKTt2YXIgbWM9Yy5PbHx8bWMsTT1uZXcgbWM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLlhqPXRoaXMuYVsxMF07dGhpcy5Pcz10aGlzLmFbNl07dGhpcy5HdD10aGlzLmFbMV07dGhpcy52dD10aGlzLmFbNV07dGhpcy5jcT10aGlzLmFbMTBdO3RoaXMuQ3A9dGhpcy5hWzEwXTt0aGlzLlhxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuWnM9YjtiLnByb3RvdHlwZT17S286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxvOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yajp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3M6dGhpcy5GdChhKX0sRnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HdDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNxOnRoaXMuQnAoYSl9LEJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ3A6dGhpcy5XcShhKX0sCldxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYz1jLlpzfHxuYywkYz1uZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5Lbyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueWMoay5DdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueWMoay5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBhZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHFjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS55cigpLHtpZDpiZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuTm89dGhpcy5hWzZdO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsxXTt0aGlzLm90PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVs2XTt0aGlzLkRzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTG09YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhtOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMud3M6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmRrOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTm86dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5obDp0aGlzLktqKGEpfSxLajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGo6dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm90OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Hazp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWGs6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5MbXx8b2MsY2Q9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLldtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zaD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMucmQ9MDt0aGlzLiRhPSIiO3RoaXMueGQ9W107dGhpcy55ZD0wO3RoaXMudWg9ITE7dGhpcy5UZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5saT1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLnNoPWF9LGJmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxpdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy4kYV1bYV0pOwpyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oYSxiKXtlLnphKCJ3ZWx0LmRlIikmJmUuWmEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy56cigpKXRoaXMubGIubCh0aGlzLmxiLm1kLHRoaXMubGIuRGEsdGhpcy5sYi5WZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLnhjKTtlbHNlIGlmKHRoaXMuUHEoKSl0aGlzLmN1KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmUudihrLmFkLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5JdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFFhKGwsdGhpcy5sYixnKTtsLmh1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5ncyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuRWgobCl9fSx6cjpmdW5jdGlvbigpe3ZhciBhPQpuZXcgRGF0ZSxiPTA7aWYodGhpcy5yZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnJkLmdldFRpbWUoKSx0aGlzLnJkPWEsM0U1PGI/ITA6ITE7dGhpcy5yZD1hO3JldHVybiExfSx6dTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmFmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5GYSgiYWRUYWciKTt0aGlzLkZhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5GYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMucmcoYSkpP3RoaXMuSmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX0seXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuYWYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLm91KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5yZyhjKSk/dGhpcy5KYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX19LHJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxUdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnN1KHRoaXMueXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTGEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuYWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuSmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuYmQsdGhpcy5wbGF5ZXIucygpKSl9fSxTdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm51KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSWUoKX0sZzpmdW5jdGlvbigpe3RoaXMuenUoKTt0aGlzLnBsYXllci5JZSYmdGhpcy5TdCgpO3RoaXMuVHQoKX0sVXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy54ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMud3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLAphW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy55ZD10aGlzLnhkLmxlbmd0aH0sUHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMueWQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy51aD1hO2ZvcihhPTA7YTx0aGlzLnhkLmxlbmd0aDthKyspdGhpcy54ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkJ0LmJpbmQodGhpcykpfSxCdDpmdW5jdGlvbihhKXt0aGlzLnlkLS07YSYmdGhpcy5UZS5wdXNoKGEpOzA+PXRoaXMueWQmJnRoaXMudWgoKX0sZ3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVGUubGVuZ3RoO2MrKyliPXRoaXMuVGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMubGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm9pPXRoaXMuYVs2XTt0aGlzLlZyPXRoaXMuYVsxMF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubnc9dGhpcy5hWzVdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMua3c9dGhpcy5hWzFdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMub209dGhpcy5hWzFdO3RoaXMudXM9dGhpcy5hWzhdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5ycz1iO2IucHJvdG90eXBlPXtuaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2k6dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZyOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qajp0aGlzLmx3KGEpfSxsdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnc6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF2OnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5rdzp0aGlzLnh3KGEpfSx4dzpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnl3OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vbTp0aGlzLnRzKGEpfSx0czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXM6dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5yc3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQubmkoNCl9KS5jYWxsKGNlaVF1YWVmaGFpQnV4YWUsY2VpUXVhZWZoYWlCdXhhZSk7Cg==
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
109.71.25.30
, Germany,
ASN29551
(HGCOMP-ASN, DE),
- Reverse DNS
- Software
-
nginx/1.14.1 /
- Resource Hash
- cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
|
GET
H/1.1
|
200
OK
|
config.json
Show response
hgc-cf-cache-1.svonm.com/www.giga.de/
Frame 4650
|
653 B
1 KB
|
38ms
38ms
|
XHR
application/json |
52.84.163.227
Amazon.com
|
|
General
- Full URL
- https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=1334420659
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGNlaVF1YWVmaGFpQnV4YWU9Y2VpUXVhZWZoYWlCdXhhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5aYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5zbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5hZCxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlJhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuYmYoYyk7YS5qdShsKTthLml1KG0pO2EuVXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkliLmxlbmd0aCl7dmFyIGE9bC5JYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG49dGhpcy5hWzZdO3RoaXMuTHA9dGhpcy5hWzZdO3RoaXMueG09dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5IcD1iO2IucHJvdG90eXBlPXtDbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG46dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSHB8fGhhLHJjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zbz0hMTt0aGlzLlhiPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQXQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLk5nPXt9O3RoaXMuWmU9ITF9Yy5Gaj1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LEFjOmZ1bmN0aW9uKCl7dGhpcy5aZXx8KHRoaXMuWmU9ZS5hYSgxMCkpO3JldHVybiB0aGlzLlplfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuTmdbYV0mJih0aGlzLk5nW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLAp0aGlzLkh1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnp0KGEuZGF0YSl9LAp6dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LGxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudHEoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmVoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KbmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sa246ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy52YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmVxKGEpKXJldHVybjsoYj10aGlzLmxnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT0KYX19LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxmYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHNlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sQ2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6CiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxKaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxXZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LHplOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCwKZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOwowPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZShhKX0uYmluZCh0aGlzKSwxMDApfSxHYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDwKYTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9CjA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHQucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLQo4XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt4PWs7dT1sO3I9bTtmb3IoZj0wOzE5Pj1mO2YrKylwPWQocSw1KSsobiZ4fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrCmIoZykrYihrKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7CnJldHVybiBifSxGcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5SYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxTYTpmdW5jdGlvbigpe3ZhciBhPXtDaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxacTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSwKQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEFrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxobzpmdW5jdGlvbigpe3JldHVybiBhLkNpKCl8fGEuSmkoKXx8YS5acSgpfHxhLkNsKCl8fGEuT20oKXx8YS5BaygpfHxhLiRsKCl9fTtyZXR1cm4gbnVsbCE9YS5obygpfSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEJjOmZ1bmN0aW9uKGEpe2E9dGhpcy52YShhKS5ob3N0LnNwbGl0KCIuIik7CnZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LENxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudmEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxmcDpmdW5jdGlvbihhLApiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sQ3U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuWGgoYikrIjoiK3RoaXMuWGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxhZjpmdW5jdGlvbihhKXt0aGlzLlhiPQphfSx2ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlhiO3RoaXMuVmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHljOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLllhKGIsZCkpO2ImJihCPWsuWWEoYSxiKSk7ZiYmKEI9ay5ZYShCLGYpKTtxJiYoQj1rLllhKEIscSkpO2MmJihCPWsuWWEoQixjKSk7ZyYmKEI9ay5ZYShCLGMpKTtlLnljKEIpfSxDdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmCjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTtiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DdChhKTtpZihiKWlmKCFsfHwKIWwuWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuemQoKTtsLnhhKGEsITApO2E9bC54YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pOwp0aGlzLk1jW2ZdfHwodGhpcy5NY1tmXT0wKTt0aGlzLk1jW2ZdKys7MTA8dGhpcy5NY1tmXXx8KGY9bC56ZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC54YShmLCEwKSxmPWwueGEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsCihmWzBdP2ZbMF06IiIpKyhmWzFdP2ZbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sR2U6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuRm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxxZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMua2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmxkKGEpOiIifSxsZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSwKYixkLGYpe2Q9ITE7aWYoYi5CZShhKXx8dGhpcy5KcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LlllJiZ3aW5kb3cuc2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7CmQmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLlphKGEsYi5IYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5vZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5rbihlLGEpO3JldHVybiBlfSxaYTpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godGMpe2ModGMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7CmVsc2V7bS54YShhLGUpO2U9bS54YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uSWEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYKMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LCRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLktjKWZvcih2YXIgYyBpbiB0aGlzLktjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuS2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKToKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYSxmLkhhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy4kcihmLm9kKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LYz1hfSx3dzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuWmEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTsKZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0saW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxEcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5Ganx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Faj1iO2IuWWE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnB0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLk1wPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iuc3c9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5MZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuUWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuVWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmNuPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkh2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaGc9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Vbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmJkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuYWQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlNmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5lbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUmM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLldkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLllkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuZG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmRpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuQnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5zZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi5wZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuaWc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmN3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkR2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIuRXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkN2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpO3ZhciBrPWMuRWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnc9dGhpcy5hWzhdO3RoaXMuZW89dGhpcy5hWzNdO3RoaXMudGk9dGhpcy5hWzRdO3RoaXMuVGo9dGhpcy5hWzhdO3RoaXMubW09dGhpcy5hWzldO3RoaXMuY3I9CnRoaXMuYVsyXTt0aGlzLnNyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLnJuPWI7Yi5wcm90b3R5cGU9e2V3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mdzp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZW86dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50aTp0aGlzLlNqKGEpfSxTajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVGo6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1tOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jcjp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLnJufHxqYSx1Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuZXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Haj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHhxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lKwpuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxqZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuamQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5qZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudWUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5qZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sVGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLnhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuamQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuR2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXc9dGhpcy5hWzNdO3RoaXMuQXA9dGhpcy5hWzJdO3RoaXMuYXY9dGhpcy5hWzEwXTt0aGlzLnZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs0XX1jLmR1PWI7Yi5wcm90b3R5cGU9e3p3OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuQXc6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFwOnRoaXMuJHUoYSl9LCR1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmR1fHxrYSx2Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy56dyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuUWk9Yn0pKGMpO3ZhciBMPWMuUWl8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGk9dGhpcy5hWzddO3RoaXMuaGo9dGhpcy5hWzEwXTt0aGlzLnpuPXRoaXMuYVs0XTt0aGlzLnJpPQp0aGlzLmFbOV07dGhpcy5Ucj10aGlzLmFbOV07dGhpcy50bj10aGlzLmFbMTBdO3RoaXMuT2s9dGhpcy5hWzNdO3RoaXMua289dGhpcy5hWzVdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuS249dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy53bD1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTGk6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhqOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bjp0aGlzLnBpKGEpfSxwaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucmk6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRyOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG46dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmtvOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jdDp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLndsfHxsYSx3Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuS2E9e307dGhpcy5JPW51bGw7dGhpcy5IYz0xMDA7dGhpcy5IYj0wO3RoaXMuVGE9MTUwO3RoaXMuS2I9MDt0aGlzLmt1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYT8odGhpcy5IYisrLHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuSGMpKTowPnRoaXMuVGEmJih0aGlzLktiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IYj50aGlzLlRhPyEwOiExfSxYZTpmdW5jdGlvbigpe3RoaXMuSGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGt1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5LYVtiLmphKCldPWI7TSYmTS5haCYmTS5HdShiKX0sV3c6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZSh0aGlzLkthKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9LEVyOmZ1bmN0aW9uKGIpe2I9Yi5HYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkthKWlmKGIuaWQ9PQp0aGlzLkthW2FdLkdhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG54OmZ1bmN0aW9uKGIpe3RoaXMuS2FbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBwPWMuTmx8fHA7KGZ1bmN0aW9uKGMpe2MuUGw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5IYz0xMDt0aGlzLkhiPTA7dGhpcy5UYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLm5nPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuR2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTGE6ZnVuY3Rpb24oKXt9LApzdTpmdW5jdGlvbihiKXt0aGlzLlc9Yn0sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XfSxudTpmdW5jdGlvbihiKXt0aGlzLkplPWJ9LFZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmV9LEllOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYSYmKHRoaXMuSGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkhjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHB4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlFxKCl8fHRoaXMuZm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxKYTpmdW5jdGlvbigpe3JldHVybiExfSxmeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEljOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRWg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSx6aDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sJHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGt4OmZ1bmN0aW9uKCl7dGhpcy5uZ3x8KHRoaXMubmc9ITApfSxwZTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5QbHx8dDsoZnVuY3Rpb24oYyl7Yy5taT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkhmPSIxIjt0aGlzLklmPSIyIjt0aGlzLlptPSIzIjt0aGlzLk9jPTA7dGhpcy5paD0KMzA7dGhpcy5QYj1bXTt0aGlzLmdiPVtdO3RoaXMubWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuV2Y9dGhpcy4kaD0hMTt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5iZihiKTt0aGlzLmx1KGEpfSxnOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3RoaXMuJGh8fCh0aGlzLiRoPSEwLGUuR2UoKSl9LE5lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5ZYiYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9CmUuQWMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLkFjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT0xfSxCcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldLmluaXRpYXRvciE9ZS5BYygpJiYodGhpcy5jZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnVhKCkpe3RoaXMudnIoKTtpZighdGhpcy5CcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5jZigpO3JldHVybn10aGlzLmNmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5UaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLAphKXt0aGlzLnVhKCl8fCh0aGlzLlBiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sVGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1lLnVuaXF1ZSh0aGlzLlBiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5tY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm1jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMubWNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLApiLCEwLGEpfX0sWnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSGZ9LGNmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0scXU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlptfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuT2N9LE5mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkhmfSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5JZn0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuT2N9LGJmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sbHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LHZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sY3M6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLm1pfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbN107dGhpcy5KbD10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMTBdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuZXA9YjtiLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zbjp0aGlzLklsKGEpfSxJbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkpsOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tcDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc206dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFxOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7CnZhciBuYT1jLmVwfHxuYSx4Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Ybig0KTsoZnVuY3Rpb24oYyl7Yy5waj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5wanx8b2E7KGZ1bmN0aW9uKGMpe2MucWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLkl3O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMucWp8fHBhOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLnJqfHxxYTsobmV3IHFhKHIpKS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm1sPWI7Yi5wcm90b3R5cGU9e2hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLm1sfHxyYSx5Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ocig0KTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3RoaXMuc2coKTt0aGlzLnVnKCk7dGhpcy5Ubz0hMX0sc2c6ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuWmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5aYil7dmFyIGI9dGhpcy5HYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuWmI9ITApO3RoaXMuWihhKX19LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sSWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkplJiYoMCx0aGlzLkplKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5oa3x8c2E7KGZ1bmN0aW9uKGMpe2MuZ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuWGQ9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5QYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJgohdGhpcy51YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMucmEoKSx0aGlzLmdldFBsYXllcigpLlRvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS52ZCgpLGEua2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUGM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5OZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlFjLmluZGV4T2YoYSkmJgp0aGlzLlFjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5RYy5sZW5ndGg+PXRoaXMuWGQmJnRoaXMubSgpKX0sY3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5uZT90aGlzLm5lKys6dGhpcy5uZT0xOnRoaXMubWU/dGhpcy5tZSsrOnRoaXMubWU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSmgoYS52aWRlb1RhZyk/YS5aYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlBjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuWmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5na3x8dGE7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ycSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkVyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sVHc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnJxOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5pa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVqPXRoaXMuYVsyXTt0aGlzLnh1PXRoaXMuYVs2XTt0aGlzLnprPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMuVW49YjtiLnByb3RvdHlwZT17ZGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVqOnRoaXMud3UoYSl9LHd1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54dTp0aGlzLnlrKGEpfSx5azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuems6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlVufHx3YSx6Yz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuZGooNCk7KGZ1bmN0aW9uKGMpe2MuR209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVihhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0KYi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuVyYmdGhpcy5XKCl9LHllOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0scWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLkdtfHx4YTsoZnVuY3Rpb24oYyl7Yy5GbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRGM9dGhpcy55YT10aGlzLlVjPSExO3RoaXMudmg9ZS5HYigxMCk7dGhpcy5aaD0hMDt0aGlzLnJjPXRoaXMuUWc9ITE7dGhpcy54cyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLkNvKCksdGhpcy5xYigpKX0seHM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuemEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5YLCI7Iix0eXBlb2YgYi5YLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlg/Yi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5YP3R5cGVvZiBiLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRWE/Yi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5FYT90eXBlb2YgYi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLkVhP2IuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouRWE/dHlwZW9mIGIuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouVWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRGN9LENyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQXIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlVjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5VYz0hMCk7cmV0dXJuIHRoaXMuVWN9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5WYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5SdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LFJ0OmZ1bmN0aW9uKCl7dGhpcy5yYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGUuemEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sU3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSwKQ286ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxkZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlkpaG9tYWRVdGlscy5SYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkNyKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuVmIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuVmIoKSx0aGlzLnJjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMudygpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuVmIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5CYSgpO2JyZWFrfX0sRG86ZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy53Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMud2MhPWIuYWRzLnN0YXRlJiYodGhpcy53Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy53Yyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLndjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EbygpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQmE6ZnVuY3Rpb24oKXswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMudWEoKXx8KGJ8fCh0aGlzLlpoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLlpoLGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxJbzpmdW5jdGlvbigpe3RoaXMuYXh8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuUXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5XdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxXdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5GbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuS2god2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLktoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LEtoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnNlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubWF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgemE9Yy5IbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRrPXRoaXMuYVs0XTt0aGlzLmZrPXRoaXMuYVs0XTt0aGlzLnF3PXRoaXMuYVsxXTt0aGlzLnZsPXRoaXMuYVsyXTt0aGlzLnZ1PXRoaXMuYVs5XTt0aGlzLmpsPXRoaXMuYVs0XTt0aGlzLkJ1PXRoaXMuYVs1XTt0aGlzLm9qPXRoaXMuYVs0XTt0aGlzLkNqPQp0aGlzLmFbNF07dGhpcy5nbT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLlppPWI7Yi5wcm90b3R5cGU9e3NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50azp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZms6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnF3OnRoaXMudWwoYSl9LHVsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bDp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnU6dGhpcy5pbChhKX0saWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpsOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2o6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMuZm0oYSl9LGZtOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuZ206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5aaXx8QmEsQWM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuRWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5QZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sd3Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMuamEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuWWImJigwPD1oLmluZGV4T2YoZCl8fGEudmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlBlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLlBlKys7aWYoMTA8dGhpcy5QZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7CnZhciBDYT1jLkVsfHxDYTsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe2lmKCF0aGlzLm9lKWlmKHRoaXMuQ2J8fCh0aGlzLkNiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuQ2IrKywxNTx0aGlzLkNiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMub2U9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCl9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnlhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5VcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLlVwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2Iud3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuRGx8fERhOyhmdW5jdGlvbihjKXtjLkZsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVGE9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubWF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLkZsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuYm49dGhpcy5hWzhdO3RoaXMub3A9dGhpcy5hWzFdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOV19Yy5FbT1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXA6dGhpcy5hbihhKX0sYW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcDp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLnJ0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5FbXx8R2EsQmM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy55dD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PQpiLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnl0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuZ2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5nZCl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5XZyh0aGlzLmdkKTtlLnplKHRoaXMuZ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLAo1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmFrfHxIYTsoZnVuY3Rpb24oYyl7Yy4kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy4kanx8SWE7KGZ1bmN0aW9uKGMpe2MuYms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5UYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuQ2coYiwiZWxlbWVudElEIik7aWYoZS5XZyhhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5LYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5LYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIEphPWMuYmt8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xcz10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzVdO3RoaXMuUGk9dGhpcy5hWzFdO3RoaXMuJHQ9dGhpcy5hWzNdO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbN119Yy56bz1iO2IucHJvdG90eXBlPXtWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmltOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJHQ6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuem98fExhLENjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLlZzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Iaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxtdTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGduOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuSGp8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5lYj1hO3RoaXMueGc9CnRoaXMuaGk9ITE7dGhpcy5taD1kO3RoaXMuTGg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZWI9bmV3IHooYSkpO3ZhciBjPXRoaXMuc2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJmwmJmwuQ2UodGhpcy5lYi51cmwpJiZsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5tdSgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmthKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LApmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLklqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmViLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLnhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5MaD90aGlzLnNiLm9wZW4odGhpcy5lYi5tZXRob2QsdGhpcy5lYi51cmwsITEpOnRoaXMuc2Iub3Blbih0aGlzLmViLm1ldGhvZCx0aGlzLmViLnVybCwhMCksdGhpcy5oaXx8KHRoaXMuc2Iud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLAphWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5zYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuQ2UodGhpcy5lYi51cmwpP2wuS2Q/bC5rYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5DZSh0aGlzLmViLnVybCksdGhpcy5taCYmdGhpcy5taCgpfXJldHVybiB0aGlzLnNifX19KShjKTt2YXIgTWE9Yy5Janx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJhPSExO3RoaXMudWM9IiI7dGhpcy5jZT10aGlzLnRjPXRoaXMud2I9bnVsbDt0aGlzLmdwPXRoaXMuSWI9dGhpcy5kaD0hMTt0aGlzLkhhPSIiO3RoaXMuWWc9ITE7dGhpcy5EYT10aGlzLm1kPSIiO3RoaXMuVWc9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLktnPXRoaXMuY2M9IiI7dGhpcy5sZT0hMTt0aGlzLm1mPTA7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjsKdGhpcy5BZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuT2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmVjPSIiO3RoaXMuZmM9W107dGhpcy5nYz1bXTt0aGlzLklkPVtdO3RoaXMuZGM9IiI7dGhpcy5uZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNjPSExO3RoaXMuSm89dGhpcy5NZD1udWxsO3RoaXMuR2g9dGhpcy5qYz10aGlzLnBnPXRoaXMucWY9dGhpcy5LZD10aGlzLmZlPXRoaXMuVmQ9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5uZD0wO3RoaXMuTWc9ITE7dGhpcy5MZz0xRTM7dGhpcy5XYz0hMTt0aGlzLk9hPTFFMzt0aGlzLktmPSIifWMuSmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuUmEsCmFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuZGgsc2lkZWxvYWRzOnRoaXMuSWIsZGlzYWJsZXRlc3RzOnRoaXMuZ3AsaG9tYWRBbGlhczp0aGlzLkhhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5ZZyxnbG9iYWxDb25maWc6dGhpcy5tZCxjbGllbnRDb25maWc6dGhpcy5EYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlksaXNCbG9ja2VkOnRoaXMuVWcsc2VydmVyOnRoaXMuQWEsc3ZtQ29uZmlnOnRoaXMuY2MsaG9tYWRBZHBhdGg6dGhpcy5LZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmxlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm1mLEhPTUFEX1ZFUklGSUVEOnRoaXMuQ2YsSE9NQURfQkxPQ0tFRDp0aGlzLkFmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLk9iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmxjLApIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuQmYsdGVzdEhpZGU6dGhpcy5lYyx0ZXN0VGFnczp0aGlzLmZjLHRlc3RUYWdzSlM6dGhpcy5nYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5kYyx0aHJvdHRsZTp0aGlzLm5mLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuQ2MsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlZkLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5mZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5LZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5xZixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5iYixzZXJ2ZXJJZDp0aGlzLkRoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmpjLHNraXBBbGxvd2VkOnRoaXMuR2gsdm1hcHM6dGhpcy5laSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuV2MsYWRGYWxsYmFja1VSTDp0aGlzLktmfX0sCk9xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0sc3E6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLApkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5pbyhhKX0seGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlJhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkJlKGEpO2M9dGhpcy52YShhKTtmPyh0aGlzLnBkKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnpkKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMudWN8fHRoaXMud2J8fHRoaXMudGN8fHRoaXMuY2UpJiYoZz10aGlzLmtzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMudXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PQpnO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLnBkKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxwZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5BYSYmdGhpcy5BYS5sZW5ndGgmJjA8dGhpcy5BYS5sZW5ndGgmJihiPXRoaXMuQWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPQpiLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuQmUoYSk7cmV0dXJuIGJ9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5IYSYmMDx0aGlzLkhhLmxlbmd0aClyZXR1cm4gdGhpcy5IYTtmb3IoZCBpbiB0aGlzLkhhKWlmKGI9dGhpcy5IYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk53O3JldHVybiJub25lIn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BYVt0aGlzLkRoXX0semQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9kKCksYj10aGlzLkZoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLApiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxqczpmdW5jdGlvbihhLGIpe3ZhciBkPWUudmEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEg9MDtIPGcubGVuZ3RoO0grKyl7dmFyIGs9Z1tIXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLmpoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9CnRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxrczpmdW5jdGlvbihhKXt0aGlzLnVjJiYoYSs9dGhpcy51Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy50YyYmKGE9dGhpcy5qcyhhLHRoaXMudGMpKTtyZXR1cm4gYX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bD10aGlzO3RoaXMuWWc9ITA7dGhpcy5tZD1hO3RoaXMuRGE9Yjt0aGlzLlZlPWQ7dGhpcy5NZD1mO3RoaXMueGM9Yzt0aGlzLmJiPWV8fHt9O3RoaXMuWnIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuRGEpdGhpcy5YcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5EYSl0cnl7dGhpcy5EYT0KYigpLHRoaXMuWmMoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFpyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLm1kK3RoaXMuJGQoImdsb2JhbCIpKSx0aGlzLktxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLiRlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuWmMoKX0uYmluZCh0aGlzKSwhMCl9LFhyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLkRhK3RoaXMuJGQoImNsaWVudCIsLTEhPXRoaXMuRGEuaW5kZXhPZigiPyIpKSksdGhpcy5aYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy4kZSgiY2xpZW50Iik7dGhpcy5rYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5HYigpKTt0aGlzLmJiJiZ0aGlzLmJiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5iYiYmdGhpcy5iYi5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGthOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKXt0aGlzLmZlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnhjPSExKTt0aGlzLnhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueGM/dGhpcy54YygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuVWc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkFmKSk7dGhpcy5MYigpO2UueWMoay5wdCk7KGI9ZS5CYyh0aGlzLm9kKCkpKXx8KGI9ZS5CYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sS3E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkRhfHx0aGlzLmNjfHx0aGlzLkhhfHx0aGlzLlpjKCk6KHRoaXMuUmE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLk9iKSksdGhpcy5MYigpKX19LFpjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLkRhfWVsc2UgYT10aGlzLkRhO3RoaXMuaXNFbmFibGVkPXRoaXMuaGMoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLmNjPWEuY29uZmlnfHwiIjt0aGlzLkhhPWEuYWxpYXN8fG51bGw7dGhpcy5LZz1hLmFkcGF0aHx8IiI7dGhpcy5sZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkRoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuY2MmJnRoaXMuSGEmJnRoaXMuQWEubGVuZ3RoP3RoaXMuRWMoITEpOih0aGlzLlJhPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLkxiKCkpfSxFYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLnpkKCkpLGQ9dGhpcy52YSh0aGlzLmNjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuY2MrdGhpcy4kZCgiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMuSnUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuJGUoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMua2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwKMTAwKSk6dGhpcy5FYyghMCl9LmJpbmQodGhpcyksITApfX0sSnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5DYz0hMDt0aGlzLkVjKCEwKTtyZXR1cm59fXRoaXMuS2Q9dGhpcy5oYyhiLnN0cmljdCk7dGhpcy5xZj10aGlzLmhjKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnBnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmhjKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuZWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5nYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy51Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8Cm51bGw7dGhpcy50Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZGg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5JYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1iLnZwYWlkfHwhMTt0aGlzLmJiLnZwYWlkPXRoaXMuamM7dGhpcy5HaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlhjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5laT1iLnZtYXBzfHwiIjt0aGlzLldjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1iLmJpdHJhdGV8fDFFMzt0aGlzLktmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmRjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuQnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmxlJiYodGhpcy5kYz1udWxsKTt0aGlzLm5mPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPQpiLnZpZGVvcGxhemF8fHt9OyF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5DYz0hMCx0aGlzLkVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmJ2KCkmJih0aGlzLmVjfHx0aGlzLmdjfHx0aGlzLmZjfHx0aGlzLmRjfHx0aGlzLklkKT90aGlzLlZlPyh0aGlzLlJhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMuaGUoKSx0aGlzLkxiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5PdSgpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuUHUoKX0sUHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUuZmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMuYmImJnRoaXMuYmIucGxheWVyJiZ0aGlzLmJiLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5rYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLkxiKCl9LExjOmZ1bmN0aW9uKGEpe3RoaXMuVmQ9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLkxiKCksdGhpcy5oZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmVjKXt2YXIgYT1lLmZkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5iaCgpKXRoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5lYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuUGgoKX19ZWxzZSB0aGlzLlBoKCl9LE9oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkdiKCkpO3RoaXMuU3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmpmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MYyh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmZjPXRoaXMuSWQpJiZ0aGlzLmZjLmxlbmd0aCl7dmFyIGQ9dGhpcy5mYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmpmKCl9LFN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxQaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigpKTt0aGlzLlR1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5PaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuZ2MmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZD10aGlzLmdjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuT2goKX0sVHU6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxqZjpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMubWYrKyx0aGlzLklhKG5ldyB6KHRoaXMuZGMpLHRoaXMuTHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5NaCgpfSxrZjpmdW5jdGlvbihhKXt0aGlzLkxjKHRoaXMuQmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxMdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5tZj90aGlzLmpmKCk6dGhpcy5rZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuTWgoKTp0aGlzLmtmKCJBQUEiKX0sTWg6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTsKdGhpcy5MYigpO3RoaXMuaGUoKX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxMYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5TYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlZkJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS56YSgidC1vbmxpbmUuZGUiKXx8ZS56YSgiZ2lnYS5kZSIpfHxlLnphKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmJoKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkNmKSk7dGhpcy5NZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk1kJiZ0aGlzLk1kKCl9LEdvOmZ1bmN0aW9uKCl7aWYodGhpcy5xZiYmCnRoaXMuT3EoKSl7dmFyIGE9dGhpcy5zcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sVGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5uZHx8KHRoaXMubmQ9MCk7dGhpcy5uZCsrO3RoaXMubmQ+dGhpcy5MZyYmIXRoaXMuTWcmJih0aGlzLk1nPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5MZywhMCkpO2E9bmV3IE1hKGEsYixkKTtmJiYoYS5oaT0hMCk7YyYmZS5GcigpJiYoYS54Zz0hMCk7ZyYmKGEuTGg9ITApO3JldHVybiBhLmxvYWQoKX0sRW86ZnVuY3Rpb24oKXtlLlNhKCl8fGUuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmthKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnBkKCl8fChhPXRoaXMudmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZWl9LEZvOmZ1bmN0aW9uKCl7dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkd2LmJpbmQodGhpcyksdGhpcy5Gdi5iaW5kKHRoaXMpKX0sR3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLk9wKCl9LEZ2OmZ1bmN0aW9uKCl7fSxPcDpmdW5jdGlvbigpe2UueWMoay5OcCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5rYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0saGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkliLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkliW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlphKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5pYSgpXT10aGlzO2UuWmEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5uZn0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEdiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0saGM6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEZoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsaCxjO2ZvcihoPTc7MDw9aDtoLS0pYz1hPj4+NCpoJjE1LGQrPWMudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGU9QXJyYXkoODApLGc9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHI9MzI4NTM3NzUyMCxuLHAsdSx0LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj0KYS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGYpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyllW2ZdPXdbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspZVtmXT1kKGVbZi0zXV5lW2YtOF1eZVtmLTE0XV5lW2YtMTZdLDEpO2M9ZztuPWs7cD1sO3U9bTt0PXI7Zm9yKGY9MDsxOT49ZjtmKyspdj1kKGMsNSkrKG4mcHx+biZ1KSt0K2VbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj00MDs1OT49ZjtmKyspdj1kKGMsNSkrKG4mcHxuJnV8cCZ1KSt0K2VbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NjA7Nzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2c9ZytjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7cj1yK3QmNDI5NDk2NzI5NX1yZXR1cm4oYihnKStiKGspK2IobCkrYihtKStiKHIpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5Kanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaXA9CnRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLlprPXRoaXMuYVsxMF07dGhpcy5vbz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs5XX1jLk5yPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLnBzKGEpfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXM6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlwOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ldDp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWms6dGhpcy5ubyhhKX0sbm86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgT2E9Yy5Ocnx8T2EsRGM9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkxxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5QP3RoaXMuJGE9YS5mLlAoKTp0aGlzLiRhPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnZkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuQmguYmluZCh0aGlzKSxtdXRlOnRoaXMuS2UuYmluZCh0aGlzKSx1bm11dGU6dGhpcy50di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVGI9dGhpcy5WYz0hMTt0aGlzLmZvPTFFMzt0aGlzLnBhPW51bGw7dGhpcy5MPWI7dGhpcy5OYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMucm89ZS5hYSgxMCk7dGhpcy5mZj0wO3RoaXMuVGM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5UYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJgooKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuVGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubm49ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5uaD10aGlzLkVkPSExO3RoaXMuZ2g9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLlpkPSExO3RoaXMuV2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5ZYj0hMTt0aGlzLlZvPWUuYWEoMTApO3RoaXMuRmI9ZS5hYSgxMCk7dGhpcy5EYj1lLmFhKDEwKTt0aGlzLkhoPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5qZT10aGlzLmNkPXRoaXMuaGY9dGhpcy5yYj10aGlzLmtjPXRoaXMucGg9dGhpcy5oZD10aGlzLmN2PXRoaXMudWI9dGhpcy5FYj0hMTt0aGlzLnBjPVtdOwp0aGlzLiRiPXt9O3RoaXMuaHQ9MjAwO3RoaXMueGY9dGhpcy55Zj10aGlzLmVlPXRoaXMud2Y9dGhpcy5VZT0hMTt0aGlzLnVkPXt9fWMuRGo9YjtiLnByb3RvdHlwZT17aHU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy4kYV0mJnRoaXMuY29uZlt0aGlzLiRhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuJGFdW2FdKTtyZXR1cm4gYn0sVWg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuWGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLkdkKCJjYWxsIix0aGlzLldhKCkpO2UudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEZlOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMudWI9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlkpdGhpcy5mZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLAp0aGlzLkwuR28oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlJhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlVoKCksbmV3IFModGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuVWgoKSxuZXcgUyh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKToKdGhpcy5QYSgpO2Vsc2V7dmFyIHNjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3NjLkZlKGEsYixkKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7YS5YYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5oZD0hMTt0aGlzLmM9YTt0aGlzLnR1KHRoaXMuYyk7dGhpcy51ZD1uZXcgUGEodGhpcy5jLkl2LHRoaXMudmlkZW8se30pO3RoaXMuSGcoYSk7dGhpcy5wYz10aGlzLnpnKGEpO3RoaXMuUW8oKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5FcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ucShhKSkpOwpyZXR1cm4gY30sbnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LEVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0KMDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlhhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZWQmJmEuZWQuZXJyb3ImJmEuZWQuZXJyb3IuY29kZSYmKGI9YS5lZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk5jLmNvZGU6Yj09Ri5SZC5jb2RlP2UudihrLmR3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSwKdGhpcy5CKCksdGhpcy5DKCkpOihlLkdlKCksYj09Ri5GZi5jb2RlJiZlLnYoay55cyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay5NcCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuR2QoImVtcHR5Iix0aGlzLldhKCkpO3RoaXMuVWEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5HZi5jb2RlOmUudihrLm93LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuc3csdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudihrLnpzLHRoaXMuYy5BLAp0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay5Edix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuemYuY29kZTplLnYoay5Fdix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5VYihhKTt0aGlzLlBhKCl9LFViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgYz1hLk5hLnBvcCgpO3RoaXMuRWUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHR1OmZ1bmN0aW9uKGEpe3RoaXMuamU9ITE7dGhpcy5OYj10aGlzLmIuSzsKdmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuTmIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlVlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXg9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTsKdGhpcy5ubiYmdGhpcy5wbGF5ZXIucGUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnBlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5obihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuVWUmJmIubG9hZCgpO2lmKHRoaXMuUWgoYikpe3RoaXMuR2QoInNldHVwIix0aGlzLldhKCkpO3RoaXMubG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlVlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPQp0aGlzLnBhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUm8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5wYS5hcHBlbmRDaGlsZChiKSx0aGlzLnJ1KCkpOnRoaXMuYy5vcmlnaW4ucWcody5RZCl9LHJ1OmZ1bmN0aW9uKCl7dGhpcy53Zj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmI9ITApO2UuaWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJmUubW4odGhpcy5jLm9yaWdpbi5zYSk7CmUuZmIoInNldFVwVnBhaWQiKTt0aGlzLkdkKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnFoKCk7dGhpcy5iLmRmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5kZigpO3RoaXMucGE9dGhpcy5OYj10aGlzLmIuSzt0aGlzLmFpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5KYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuSHEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmFlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLldiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnBjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuU3YoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5UdigpLHRoaXMuYi5XYighMCksIXRoaXMuTWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuTWI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkFlKHRoaXMuTWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5XYighMCksdGhpcy5YdigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuV2IoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWnYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuJHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5idygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5TYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5oZyx0aGlzLmMuQSwKdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLldjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy55ZiYmKHRoaXMueGY9ITEsdGhpcy5iYygpKSx0aGlzLlZ2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnJiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5KYigibXV0ZWQiLCJ1c2VyIiksZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkpiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnBmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLllkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLmFlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5YZihmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5XZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5rYz0hMH0sVnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMua2M9ITF9LFh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sCld2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlNmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZmIoImltcHJlc3Npb24iKTt0aGlzLkloKCk7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZmIoInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxadjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmhkPSEwO2UuZmIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sJHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpOwplLmZiKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5mYigidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMuc2YoKTtlLmZiKCJjb21wbGV0ZSIpO3RoaXMuVmEoImNvbXBsZXRlIil9LGZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZmIoImFkc3RvcHBlZCIpO3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuaWUoKTsKdGhpcy5IPSExO3RoaXMuUGEoYSl9fSxTdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLmZiKCJlcnIiLGIpO2UudihrLmN3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5maSghMCl9LGhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuUmEmJmIuaXNFbmFibGVkJiYhYi5wZCgpKXt2YXIgZD1iLnZhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsCnRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuTnYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxRaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sbG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuYmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxiaTpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGJ8fHRoaXMudWYoYSl9LmJpbmQodGhpcyksdGhpcy5mbykpfSx1ZjpmdW5jdGlvbihhKXtpZighdGhpcy5WYyYmdGhpcy5RaCh0aGlzLnZpZGVvKSYmIXRoaXMuRWImJiF0aGlzLlRiKXt0aGlzLlZjPSEwO3RyeXtpZighZS5TYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRWJ8fCh0aGlzLkViPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMuS3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5kZigpO3RoaXMuSnYoKTt0aGlzLmFpKCk7dGhpcy5hZygpO3RoaXMuYi5xaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5nZigpfX0sZ2Y6ZnVuY3Rpb24oKXt0aGlzLmNkfHx0aGlzLk1mKCl9LE1mOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuY2R8fChhP3RoaXMuUGEoKToodGhpcy5LZSghMCksdGhpcy5NZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmFjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0uYmluZCh0aGlzKTt0aGlzLnJlKCkuRWgodGhpcyl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5FYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLmNuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5QYSgpfSxQYTpmdW5jdGlvbihhKXtpZighdGhpcy5qZSlpZih0aGlzLmplPQohMCx0aGlzLk5kfHwoZS52KGsuQnMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5uYyl7ZS5vYigibmV3U21hbGxBZElkIik7dGhpcy5mZisrO3RoaXMuVGI9dGhpcy5WYz0hMTt0cnl7dGhpcy5BZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLk5iLnJlbW92ZUNoaWxkKHRoaXMucGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5ZaCgpfWNhdGNoKGcpe310aGlzLmhmPSEwO3RoaXMuYi52ZSgpO3RoaXMuWWI9ITE7dGhpcy5yZSgpLnpoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLkxlKCk7dGhpcy5jLm5jJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5rZSgpKX1lbHNlIHRoaXMua2UoKX0sTnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7CnRoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50ZihhKSl9LHRmOmZ1bmN0aW9uKGEpe3RoaXMuVGI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLkVvKCk7dGhpcy5jLm9yaWdpbi5xZyh3LlFkKX0sY2k6ZnVuY3Rpb24oKXtpZih0aGlzLmN2KXRoaXMuUGEoKTtlbHNle3RoaXMuWWI9ITA7dGhpcy5iLmYuSmEmJiF0aGlzLmhmJiZ0aGlzLmIuZi5KYSgpJiZlLnYoay5hZCx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5mdihhKTtpZighdGhpcy5NYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmCih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5NYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuQWUodGhpcy5NYil9Yz0iIjt0aGlzLmMuZWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGgpKSYmKGM9dGhpcy5jLmVmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSwKdGhpcy5FZHx8KHRoaXMuRWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMudGI/KHRoaXMuVGI9dGhpcy5WYz0hMSx0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5OYi5yZW1vdmVDaGlsZCh0aGlzLnBhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLlloKCksdGhpcy5jLm9yaWdpbi5MZSgpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlRjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlpkPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxWaDpmdW5jdGlvbigpe3RoaXMucGh8fAoodGhpcy5waD0hMCx0aGlzLmhkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sZnY6ZnVuY3Rpb24oYSl7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLldofHx0aGlzLkVifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuVmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZoKCl9LmJpbmQodGhpcykpLHRoaXMuRWJ8fHRoaXMuSWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5WYSgic3RhcnQiKSxlLnYoay5PZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksCnRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5qYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmhkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5RZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLAoidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuV2g9YSl9LEdkOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxJaDpmdW5jdGlvbigpe2UudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLHRoaXMuV2EoKSwhMCl9LFVhOmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX2hkX2FkX2Vycm9yIixhLCEwKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMud2Z8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxKYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkViKXt0aGlzLnVkJiZ0aGlzLnVkLnRyYWNrJiZ0aGlzLnVkLnRyYWNrKGEpOwppZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5GcSh0aGlzLmMuTmEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRHIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5FZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZG4sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKGcudXJsLApnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuY3AodGhpcy5jLk5hLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWUuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLndmJiYoYj0iX3ZwYWlkIik7dGhpcy55ZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxFZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC54YShhKSxjJiZiLmduKGMpLGZ8fChmPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuam4oYSksdGhpcy5MLklhKGIsZnVuY3Rpb24oKXt0aGlzLnloKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGpuOmZ1bmN0aW9uKGEpe3RoaXMuJGJbYV09Im9wZW4ifSx5aDpmdW5jdGlvbihhKXt0aGlzLiRiW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuJGI9e319LEZ1OmZ1bmN0aW9uKCl7dmFyIGE9CjAsYjtmb3IoYiBpbiB0aGlzLiRiKXRoaXMuJGIuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy4kYltiXSYmYSsrO3JldHVybiBhfSxGcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGNwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEt2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mdi5iaW5kKHRoaXMpKX0sTHY6ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmJjKCk6dGhpcy5jLlNiJiYoZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KIl90b3AiO3RoaXMuTC5XYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5TYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuU2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxKdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLAphLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5UYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5YYyYmKGI9dGhpcy5MLlhjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnBhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJgp0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxhaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuVm87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuRmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5TaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuYmMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkRiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ldi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5kdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkhoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmVmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXToKKGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLnBhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5YZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi5xYSYmdGhpcy5iLmYucWEoKSYmKGUudihrLmlnLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5LZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGJjOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLnhmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuUmMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxTaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMua2M/KGUubGEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuSmIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwidXNlciIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMucmI/KGUubGEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sS2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwiY29udGVudCIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx0djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5KYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LGFjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmFjKTt0aGlzLmNkfHx0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0sa2U6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuZmQoKTshdGhpcy5MLmpjfHxlLlNhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5lZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5uaD8odGhpcy5jZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLmpnKCkpOih0aGlzLm5oPXRoaXMueWY9dGhpcy54Zj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKSx0aGlzLmVlPSEwLGE9ZS4kZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5GZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5GdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLHRoaXMuaHQpOih0aGlzLmhmPSEwLHRoaXMuYi52ZSgpLHRoaXMuYi5ZdCgpLHRoaXMuWWI9ITEsZS52KGsuVW8sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnJlKCkuemgoKSl9LHJlOmZ1bmN0aW9uKCl7dmFyIGE9Cm51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxhZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLnplKHRoaXMudmlkZW8sYSk/dGhpcy5CaCgpOnRoaXMudmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5TYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnBjJiYwPHRoaXMucGMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnBjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT0Ke307YS5hZHNlc3Npb25faWQ9dGhpcy5ybysiLSIrdGhpcy5mZjt0aGlzLmMmJnRoaXMuYy5EZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuRGcoKSk7cmV0dXJuIGF9LG9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5Eanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXY9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzZdO3RoaXMuY2w9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5WcT1iO2IucHJvdG90eXBlPXt4djpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXY6dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNpOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuVnF8fApSYSxFYz1uZXcgUmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy54dig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkNhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMub2M9dGhpcy5xYz0hMTt0aGlzLnNhPSIiO3RoaXMudmY9ITE7ZCYmZC5lbXB0eT90aGlzLmJzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuZmQoKSxiO2I9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7CmMmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOmwueGEobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLmxnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT0KY3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC54YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnhhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5hcy5iaW5kKHRoaXMpLHRoaXMuWXIuYmluZCh0aGlzKSl9LApBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5DYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuWGIpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7CnZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuQ2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLlhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5YYnx8dGhpcy5JcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5LdSgpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrCiciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtmW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxJcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmCmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGFzOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMuQ2E9YS5yZXNwb25zZVhNTCx0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuU2QpKX10aGlzLlg9dGhpcy5BZygpO3RoaXMucWM9dGhpcy5sZigpO3RoaXMub2M9dGhpcy5OaCgpOwp0aGlzLlgubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuUWEody5OYyx7ZXJyb3I6dGhpcy52Zj9GLlJkOkYuRWZ9KSl9LGJzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUWEody5TZCkpfXRoaXMuWD10aGlzLkFnKCk7dGhpcy5xYz10aGlzLmxmKCk7dGhpcy5vYz10aGlzLk5oKCk7dGhpcy5YLmxlbmd0aD90aGlzLkdjKCk6dGhpcy5vYSh0aGlzLlFhKHcuTmMse2Vycm9yOnRoaXMudmY/Ri5SZDpGLkVmfSkpfSxZcjpmdW5jdGlvbigpe3RoaXMub2EodGhpcy5RYSh3LkRmLHtkZXB0aDphfSkpfSxHYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLktyKCk/dGhpcy5VdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLklnKCksaCx7QWRTeXN0ZW06dGhpcy5tcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5vYSh0aGlzLlFhKHcuR2YpKTooYT0wLHRoaXMuQnYoKSYmdGhpcy5RZSh0aGlzLldvKCkpKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkdjKCkpOnRoaXMucGFyZW50LkxlKCl9LGtoOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5raCgpfSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ1KCk/dGhpcy5RdSgpPyEwOigtMSE9dGhpcy56YygpP3RoaXMub2EodGhpcy5RYSh3LlBkKSk6dGhpcy5vYSh0aGlzLlFhKHcuemYpKSwhMSk6KHRoaXMub2EodGhpcy5RYSh3Lk5jLEYuRmYpKSwhMSl9LFFlOmZ1bmN0aW9uKGEpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLk5hPWEuTmEuY29uY2F0KHRoaXMuSGUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWGE9CmEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuUWUoYSl9LFdvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLmR1cmF0aW9uPXRoaXMuemMoKTthLk89dGhpcy5GZygpO2EuU2I9dGhpcy5vcSgpO2EuSXY9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5scSgpO2EuZWY9dGhpcy5EcShhLmR1cmF0aW9uKTthLlhhPWEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLlhhPWIuWGE/Yi5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5OYT1iLmVycm9yLmNvZGUhPXcuUGQuY29kZT9iLk5hLmNvbmNhdCh0aGlzLnBxKCkpOmIuTmEuY29uY2F0KHRoaXMueXEoKSkpOwp0aGlzLlgubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5VYiYmdGhpcy5wYXJlbnQuVWIoYiksYT0wLHRoaXMuR2MoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxVYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5VYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUWEoYSxiKSl9LFFhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxSdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy56YygpfSxsZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxOaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMubGYoKSYmKGE9ITApO3JldHVybiBhfSxKdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMudmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sS3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LG1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxIZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0KIkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0seXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sCnBxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxvcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxPdzphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD0KYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5sZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxEcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkN1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubGQoYSk6IiJ9LGxkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9rPXRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVsxMF07dGhpcy5Qbz10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLlRwPWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMub2s6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhrOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qbzp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLlRwfHxVYSxGYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5uayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk5hPVtdO3RoaXMuTz1bXTt0aGlzLlNiPSIiO3RoaXMuQT10aGlzLm5jPXRoaXMudGI9ITE7dGhpcy53ZT10aGlzLm9yaWdpbj1udWxsO3RoaXMueGU9IiJ9Yy5NbD1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx3cTpmdW5jdGlvbigpe2lmKCF0aGlzLndlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkNhKXt2YXIgYT10aGlzLm9yaWdpbi5DYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLndlPWFbY10pfXJldHVybiB0aGlzLndlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueGUpcmV0dXJuIHRoaXMueGU7dmFyIGE9IiI7KGE9dGhpcy53cSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMueGU9YX0sSHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLk1sfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUG49dGhpcy5hWzZdO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuYXI9dGhpcy5hWzVdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5maj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUG46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkpwOnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hcjp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLmZqfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Obig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsCk1hOiJYTUxfUEFSU0VfRVJST1IifSx6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTWE6IkRVUkFUSU9OX0VSUk9SIn0sTmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE1hOiJFTVBUWV9WQVNUIn0sR2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTWE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LERmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsCm1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixNYToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixNYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEZ3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLApNYToiTUVESUFGSUxFX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTWE6IkRVTU1ZX0FEIn19LEY9e0VmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTWE6Ik5PX0FEUyJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixNYToiTk9fTUVESUFGSUxFUyJ9LEd3Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE1hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTWE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19CmMuVmo9YjtiLnByb3RvdHlwZT17bnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Wanx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMubnMoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5lZD1iO3RoaXMuTmE9W107dGhpcy5vcmlnaW49bnVsbH1jLmtqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5ranx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3E9dGhpcy5hWzVdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMuZmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19CmMudnA9YjtiLnByb3RvdHlwZT17anE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54aTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLnZwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5qcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuQWg9YTt0aGlzLnZpZGVvPWI7dGhpcy5MZD1bXTt0aGlzLnhoPVtdO3RoaXMuTWU9W107dGhpcy5Ndj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLlBrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuQWgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5BaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBnPWUuY29udGVudFdpbmRvdztnLml4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlZ0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLk90LmJpbmQodGhpcyl9O3ZhciBrPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwprLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztnLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7Zy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspO3RoaXMuTGQucHVzaCh7c3JjOmMsZnJhbWU6ZSxtdDpmLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5NZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLk1lW2JdO2MudHlwZT09PWEmJmMueW8odGhpcy5xcShhKSl9fSxxcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntyeDohMCxxeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntleDoidmlkZW8iLHR4OiJqc0N1c3RvbSIsdXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsdng6MSxQdzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEdxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5MZC5sZW5ndGg7YisrKWlmKHRoaXMuTGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5MZFtiXS5tdDtyZXR1cm4iIn0sVnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLkdxKGIpLHZlbmRvcjpifSk7CnRoaXMuRHUoKX0sT3Q6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk12Lm1hcChmdW5jdGlvbihhKXt0aGlzLllmKGEsYil9LmJpbmQodGhpcykpOnRoaXMuWWYoYSxiKX0sWWY6ZnVuY3Rpb24oYSxiKXt0aGlzLk1lLnB1c2goe3R5cGU6YSx5bzpiLG94OiExfSl9LER1OmZ1bmN0aW9uKCl7dGhpcy54aC5tYXAoZnVuY3Rpb24oYSl7YS5Hcnx8KGEuaHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Hcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUGE9Yy5Qa3x8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXM9dGhpcy5hWzNdO3RoaXMudnY9dGhpcy5hWzEwXTt0aGlzLiRvPQp0aGlzLmFbOV07dGhpcy5xbj10aGlzLmFbMV07dGhpcy5Xbj10aGlzLmFbM107dGhpcy5Ibj10aGlzLmFbMV07dGhpcy5hbD10aGlzLmFbOV07dGhpcy5rcD10aGlzLmFbOF07dGhpcy5qdD10aGlzLmFbNV07dGhpcy5Qaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs2XX1jLktrPWI7Yi5wcm90b3R5cGU9e2xzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tczp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnY6dGhpcy5abyhhKX0sWm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRvOnRoaXMucG4oYSl9LHBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xbjp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV246dGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhuOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hbDp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmtwOnRoaXMuaXQoYSl9LGl0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qdDp0aGlzLk9qKGEpfSxPajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLktrfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5scyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmliPWEuQmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5SYj1bXX1jLlZpPWI7Yi5wcm90b3R5cGU9e2dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuZ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6Cihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxJdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFloOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSwKcWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5hZCx0aGlzLmYucygpKX0sWXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5iZCx0aGlzLmYucygpKSl9LGRmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmliLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5JYyYmdGhpcy5mLkljKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPQpiLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWnAodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy52ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSWMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsKInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5SYi5sZW5ndGg7YSsrKXRoaXMuUmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5KaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLldiLmJpbmQodGhpcyksMTApfSxYZjpmdW5jdGlvbihhKXt0aGlzLlJifHwodGhpcy5SYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuUmIucHVzaChhKX0sdmU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5WaXx8WmEsQz1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzddO3RoaXMuRWs9dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzhdO3RoaXMuWWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5Jbj1iO2IucHJvdG90eXBlPXtndjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5odjp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3M6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVrOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGw6dGhpcy5YaShhKX0sWGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgYWI9Yy5Jbnx8YWIsS2M9bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZ3YoNCk7KGZ1bmN0aW9uKGMpe2MuQWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5CZChiKTt0aGlzLm1nKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx5ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYmI9Yy5BbHx8YmI7KGZ1bmN0aW9uKGMpe2Muemw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuUWI9dGhpcy5RYnx8ITE7dGhpcy5QZj10aGlzLlJmPXRoaXMuUmc9dGhpcy5lYT10aGlzLm9mPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuVnAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm9mPSEwO3RoaXMuUmcmJnRoaXMuZ2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuWWMoKTsKdGhpcy5SZz0hMDt0aGlzLmdnKCl9LmJpbmQodGhpcykpO3RoaXMuY2coKX0sZ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5ZYygpO2lmKCF0aGlzLm9mJiYhdGhpcy5ZYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMub2YmJnRoaXMuUGYmJiF0aGlzLlJmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0sWWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApjZzpmdW5jdGlvbigpe2lmKHRoaXMuWWMoKSl7dmFyIGI9dGhpcy5HZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuUGY9Yi5Nd310aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN4KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSx6cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxWcDpmdW5jdGlvbihiLGEpe3RoaXMuUWI9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRjKCl9LmJpbmQodGhpcyksMTAwKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi55ZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLnpxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuemx8fGNiOyhmdW5jdGlvbihjKXtjLkJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkhyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlNsLiRtLlltP3dpbmRvdy5PTy5TbC4kbS5ZbS5LdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnNlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBiYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgY2IoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuVms9dGhpcy5hWzZdO3RoaXMuZXM9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzNdO3RoaXMudHQ9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMua209YjtiLnByb3RvdHlwZT17VWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZrOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lczp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXA6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmI9Yy5rbXx8ZmIsTGM9bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuVWsoNCk7KGZ1bmN0aW9uKGMpe2MuSGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5KZygpfSxKZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVihiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy50aCgpfSx0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuSGl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOwoxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy50YSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnRhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmRnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBoYj1jLkdpfHxoYjsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LHdoOmZ1bmN0aW9uKGIpe2I9bmV3IGdiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaGIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XcHx8KHRoaXMuV3A9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLndoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBpYj1jLklpfHxpYixUPW5ldyBpYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs4XX1jLnZ3PWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYj1jLnZ3fHxqYixNYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5mcig0KTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxJYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuZG18fFU7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuU2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlNjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTXMoYSl9LmJpbmQodGhpcykpO3kuU2MoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5TYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuTnEoKX0sTXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLmNtfHxWOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy50ZCYmKGI9ZS5mcChiLHRoaXMudGQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnRkfHwodGhpcy50ZD1bXSksdGhpcy50ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sU2M6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFZ1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuRmN8fCh0aGlzLkZjPVtdKSx0aGlzLkZjLnB1c2goYiksdGhpcy5YdCgpJiYodGhpcy5YZSgpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxOcTpmdW5jdGlvbigpe2lmKHRoaXMuRmMpZm9yKHZhciBiPTA7Yjx0aGlzLkZjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuRmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5WdShiKX19KX0pKGMpO3ZhciBrYj1jLmVtfHxrYix5PW5ldyBrYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlxPXRoaXMuYVsxMF07dGhpcy5Ncj10aGlzLmFbNF07dGhpcy5ibT10aGlzLmFbMl07dGhpcy55cD10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbM107dGhpcy5Cbj10aGlzLmFbMTBdO3RoaXMuJG49CnRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzJdfWMudm89YjtiLnByb3RvdHlwZT17aHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYm06dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlwOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zczp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm46dGhpcy5abihhKX0sWm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy4kbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYj1jLnZvfHxsYixOYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaHEoNCk7KGZ1bmN0aW9uKGMpe2MuRGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxKYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLkRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5FaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5FaXx8bmI7KGZ1bmN0aW9uKGMpe2MuRmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgbWIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgbmIoZSx0aGlzLkkpKS5nKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5GaXx8b2IscGI9bmV3IG9iKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJsPXRoaXMuYVszXTt0aGlzLm1yPXRoaXMuYVsyXTt0aGlzLnhqPXRoaXMuYVsxXTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs5XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLkZzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLnd2PWI7Yi5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuUmw6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1yOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXE6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkpzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWI9Yy53dnx8cWIsT2M9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUWwoNCk7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5WKGIpO3RoaXMuWihhKTt0aGlzLk50KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMub2x8fHJiOyhmdW5jdGlvbihjKXtjLm5sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpO3RoaXMuZ2k9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZ2kmJih0aGlzLkcoKSx0aGlzLmdpPSEwLHRoaXMucmEoKSk7YS5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgc2I9Yy5ubHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyByYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBzYihjLAp0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHRiPWMucGx8fHRiLFc9bmV3IHRiKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmh3PXRoaXMuYVsyXTt0aGlzLlB2PXRoaXMuYVs0XTt0aGlzLnhyPXRoaXMuYVs0XTt0aGlzLm1qPXRoaXMuYVs5XTt0aGlzLlByPXRoaXMuYVsxXTt0aGlzLmZ1PXRoaXMuYVs2XTt0aGlzLlJrPXRoaXMuYVs3XTt0aGlzLlNwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuWnU9YjtiLnByb3RvdHlwZT17Z3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh3OnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qdjp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHI6dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1qOgp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ1OnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sazp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB1Yj1jLlp1fHx1YixQYz1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5ndyg0KTsoZnVuY3Rpb24oYyl7Yy5KbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxMYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy5KbXx8dmI7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEx0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9W10pO3RoaXMuYWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnRhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnlhP3RoaXMuTHQodGhpcy55YSk6KHRoaXMueWE9dGhpcy5WYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnlhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMucmMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuYWImJnRoaXMuYWIubGVuZ3RoJiYxPHRoaXMuYWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5hYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuYWJbYV0mJjMwMyE9dGhpcy5hYlthXSYmNDAzIT10aGlzLmFiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy50YSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5JbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB2YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHdiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB4Yj1jLkttfHwKeGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVs1XTt0aGlzLnZuPXRoaXMuYVs3XTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnV3PXRoaXMuYVsxXTt0aGlzLlJuPXRoaXMuYVs1XTt0aGlzLkl0PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuQ209YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFwOnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYXQ6dGhpcy50dyhhKX0sdHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51dzp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm46dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkl0Ogp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHpiPWMuQ218fHpiLFFjPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLlBwKDQpOyhmdW5jdGlvbihjKXtjLlhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlJlPSExfSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy54dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHh0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlJlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlJlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEV1OmZ1bmN0aW9uKCl7dGhpcy5SZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuWGx8fEFiOyhmdW5jdGlvbihjKXtjLldsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5pYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ocz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5ocz8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuV2x8fEJiOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBCYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIENiPWMuWWx8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdj10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNF07dGhpcy5Mcz10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbN107dGhpcy5Daz10aGlzLmFbM107dGhpcy5icD10aGlzLmFbMV07dGhpcy5udj10aGlzLmFbMl07dGhpcy5Zbz10aGlzLmFbN107dGhpcy5Scj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLmptPWI7Yi5wcm90b3R5cGU9CntrdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubHY6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVyOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mczp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNrOnRoaXMuYXAoYSl9LGFwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5icDp0aGlzLm12KGEpfSxtdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnY6dGhpcy5YbyhhKX0sWG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllvOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBFYj1jLmptfHxFYixSYz1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5VbHx8RmI7KGZ1bmN0aW9uKGMpe2MuVGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5TbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmtkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5XcigpOnRoaXMuZmcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxTbzpmdW5jdGlvbigpe3RoaXMuTmYoKXx8dGhpcy5tKCEwKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtkKCk7IWIubmEmJmIuWCYmYi5KdyYmYi5MdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMua2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sa2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5vaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMub2g9YltjXSk7cmV0dXJuIHRoaXMub2h9LApkeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5rZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBGYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEdiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEhiPWMuVmx8fEhiLEliPW5ldyBIYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdj10aGlzLmFbM107dGhpcy5taz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxMF19Yy5XaT1iO2IucHJvdG90eXBlPXtwdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXY6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgSmI9Yy5XaXx8SmIsU2M9bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ClNjLnB2KDQpOyhmdW5jdGlvbihjKXtjLklrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sYng6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxKYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPQpjLklrfHxYOyhmdW5jdGlvbihjKXtjLkhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlNlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuU2U9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5TZSYmYiE9dGhpcy5TZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLnphKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS5qeCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmCih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhrfHxZOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5YZSgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxLYj1jLkprfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV0PXRoaXMuYVs2XTt0aGlzLlJqPXRoaXMuYVs2XTt0aGlzLmNqPXRoaXMuYVs2XTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbMl07dGhpcy5xcj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5mcz1iO2IucHJvdG90eXBlPXtEdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXQ6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Sajp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY2o6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmp2OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Uazp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTW46dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTWI9Yy5mc3x8TWIsVGM9bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuRHQoNCk7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGd4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuemp8fE5iOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5PbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIE9iPWMueWp8fE9iOyhmdW5jdGlvbihjKXtjLkFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE5iKGJbYV0pO2MubWF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IE9iKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTsKdmFyIFBiPWMuQWp8fFBiLFFiPW5ldyBQYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ZcD10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbN107dGhpcy5UbT10aGlzLmFbNF07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Ddz10aGlzLmFbNV07dGhpcy5TcT10aGlzLmFbMl07dGhpcy5Vcz10aGlzLmFbMTBdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtYcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlFzOnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5UbTp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmk6dGhpcy5CdyhhKX0sQnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/CnRoaXMuQ3c6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNxOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Vczp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmI9Yy5zanx8UmIsVWM9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuWHAoNCk7KGZ1bmN0aW9uKGMpe2MuUW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT0KYS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlYoYSl9ZWxzZSB0aGlzLmNhKCl9LE10OmZ1bmN0aW9uKCl7dGhpcy5PZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuT2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk9kfHwodGhpcy5PZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LApKYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFNiPWMuUW18fFNiOyhmdW5jdGlvbihjKXtjLlBtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFF0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMudmMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy52YyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLnZjKGEpfS5iaW5kKHRoaXMpKX0sdmM6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LEpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy52Yyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5RdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLkpmKCk7dGhpcy5QdCgpfSxQdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsZnVuY3Rpb24oYil7dGhpcy52YyhiKX0uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuS3Q9ITB9fSl9KShjKTt2YXIgVGI9Yy5QbXx8VGI7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFRiKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFViPWMuUm18fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3Y9dGhpcy5hWzVdO3RoaXMua3I9dGhpcy5hWzldO3RoaXMuRm49dGhpcy5hWzhdO3RoaXMua2s9CnRoaXMuYVs4XTt0aGlzLkJpPXRoaXMuYVs2XTt0aGlzLlh1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVs3XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmZxPWI7Yi5wcm90b3R5cGU9e3J2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zdjp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3I6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZuOnRoaXMuamsoYSl9LGprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5razp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQmk6dGhpcy5XdShhKX0sV3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlh1OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdDp0aGlzLk1tKGEpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5mcXx8V2IsVmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMucnYoNCk7KGZ1bmN0aW9uKGMpe2MudW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5yaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LApQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucmgmJih0aGlzLnJoPSEwLHRoaXMuVyYmdGhpcy5XKCkpfX0pfSkoYyk7dmFyIE89Yy51bXx8TzsoZnVuY3Rpb24oYyl7Yy50bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy5DYnx8KHRoaXMuQ2I9MCksdGhpcy5DYisrLDE1PHRoaXMuQ2Ipe2lmKHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnlhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnRtfHxQOyhmdW5jdGlvbihjKXtjLnZtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLlRhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj0KbmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuWGUoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBYYj1jLnZtfHwKWGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV3PXRoaXMuYVsxMF07dGhpcy54bz10aGlzLmFbM107dGhpcy5VaT10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbM107dGhpcy5sbD10aGlzLmFbMV07dGhpcy51cj10aGlzLmFbOV07dGhpcy5MbD10aGlzLmFbNl07dGhpcy56bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLll1PWI7Yi5wcm90b3R5cGU9e0R3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG86dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zcDp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGw6dGhpcy50cihhKX0sCnRyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy55bShhKX0seW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgWmI9Yy5ZdXx8WmIsV2M9bmV3IFpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9V2MuRHcoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSk7YSYmdGhpcy5WKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5xa3x8WjsoZnVuY3Rpb24oYyl7Yy5waz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkRjPXRoaXMueWE9dGhpcy5VYz0hMTt0aGlzLnZoPWUuR2IoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9CmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuT2crKztpZigxMDx0aGlzLk9nKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fAotMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTsKYnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy50YSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLnBrfHxhYTsoZnVuY3Rpb24oYyl7Yy5yaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9CjA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciAkYj1jLnJrfHwkYixhYz1uZXcgJGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzFdO3RoaXMudms9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdO3RoaXMuZ3Q9dGhpcy5hWzJdO3RoaXMuR3A9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMl19Yy53cD1iO2IucHJvdG90eXBlPQp7cG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFvOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52azp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHM6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmd0OnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJjPWMud3B8fGJjLFhjPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLnBvKDQpOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLAphPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLnVqfHxjYzsoZnVuY3Rpb24oYyl7Yy50aj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMudGp8fApkYzsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubWEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBkYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGVjPWMudmp8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbD10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbMl07dGhpcy5ibz10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbNV07CnRoaXMuQm09dGhpcy5hWzNdO3RoaXMueG49dGhpcy5hWzRdO3RoaXMuTWs9dGhpcy5hWzhdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMucXA9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5Vaj1iO2IucHJvdG90eXBlPXtHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5JcShhKX0sSXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpxOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm86dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG46dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1rOnRoaXMuTWooYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Oajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLnFwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgZ2M9Yy5Vanx8Z2MsWWM9bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuR2woNCk7KGZ1bmN0aW9uKGMpe2Muamk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5WKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBoYz1jLmppfHxoYzsoZnVuY3Rpb24oYyl7Yy5paT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLAoxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgaWM9Yy5paXx8aWM7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxZYTpmdW5jdGlvbihiKXtiPW5ldyBoYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGljKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLllhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5ZYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYz1jLmtpfHxqYyxrYz1uZXcgamMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ1PXRoaXMuYVsyXTt0aGlzLnJsPXRoaXMuYVs4XTt0aGlzLlpqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMucnc9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5idTp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucmw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgbGM9Yy5yd3x8bGMsWmM9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuYXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9CnRoaXMuYWg9dGhpcy4kZz0hMTt0aGlzLndkPVtdO3RoaXMuV2U9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBZYj9udWxsOlliLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuT2w9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5BcShhKTpbXSxiO3RoaXMuYWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuJGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuQ2goYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLlpnKWJyZWFrOwpiPXRoaXMuV2VbY107dGhpcy5yZihiKSYmKHRoaXMud2QucHVzaChiKSx0aGlzLkNoKGIpKX19LHJmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5yZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxDaDpmdW5jdGlvbihhKXt0aGlzLnJmKGEpJiZhLmcoKX0sR3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHQmJiF0aGlzLiRnKWZvcih0aGlzLlpnPSEwLGE9MDthPHRoaXMud2QubGVuZ3RoO2ErKyl0aGlzLndkW2FdLktiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2RbYV0uS2IpfX19KShjKTt2YXIgbWM9Yy5PbHx8bWMsTT1uZXcgbWM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLlhqPXRoaXMuYVsxMF07dGhpcy5Pcz10aGlzLmFbNl07dGhpcy5HdD10aGlzLmFbMV07dGhpcy52dD10aGlzLmFbNV07dGhpcy5jcT10aGlzLmFbMTBdO3RoaXMuQ3A9dGhpcy5hWzEwXTt0aGlzLlhxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuWnM9YjtiLnByb3RvdHlwZT17S286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxvOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yajp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3M6dGhpcy5GdChhKX0sRnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HdDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNxOnRoaXMuQnAoYSl9LEJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ3A6dGhpcy5XcShhKX0sCldxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYz1jLlpzfHxuYywkYz1uZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5Lbyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueWMoay5DdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueWMoay5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBhZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHFjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS55cigpLHtpZDpiZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuTm89dGhpcy5hWzZdO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsxXTt0aGlzLm90PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVs2XTt0aGlzLkRzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTG09YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhtOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMud3M6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmRrOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTm86dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5obDp0aGlzLktqKGEpfSxLajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGo6dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm90OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Hazp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWGs6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5MbXx8b2MsY2Q9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLldtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zaD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMucmQ9MDt0aGlzLiRhPSIiO3RoaXMueGQ9W107dGhpcy55ZD0wO3RoaXMudWg9ITE7dGhpcy5UZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5saT1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLnNoPWF9LGJmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxpdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy4kYV1bYV0pOwpyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oYSxiKXtlLnphKCJ3ZWx0LmRlIikmJmUuWmEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy56cigpKXRoaXMubGIubCh0aGlzLmxiLm1kLHRoaXMubGIuRGEsdGhpcy5sYi5WZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLnhjKTtlbHNlIGlmKHRoaXMuUHEoKSl0aGlzLmN1KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmUudihrLmFkLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5JdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFFhKGwsdGhpcy5sYixnKTtsLmh1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5ncyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuRWgobCl9fSx6cjpmdW5jdGlvbigpe3ZhciBhPQpuZXcgRGF0ZSxiPTA7aWYodGhpcy5yZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnJkLmdldFRpbWUoKSx0aGlzLnJkPWEsM0U1PGI/ITA6ITE7dGhpcy5yZD1hO3JldHVybiExfSx6dTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmFmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5GYSgiYWRUYWciKTt0aGlzLkZhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5GYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMucmcoYSkpP3RoaXMuSmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX0seXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuYWYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLm91KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5yZyhjKSk/dGhpcy5KYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX19LHJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxUdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnN1KHRoaXMueXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTGEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuYWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuSmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuYmQsdGhpcy5wbGF5ZXIucygpKSl9fSxTdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm51KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSWUoKX0sZzpmdW5jdGlvbigpe3RoaXMuenUoKTt0aGlzLnBsYXllci5JZSYmdGhpcy5TdCgpO3RoaXMuVHQoKX0sVXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy54ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMud3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLAphW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy55ZD10aGlzLnhkLmxlbmd0aH0sUHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMueWQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy51aD1hO2ZvcihhPTA7YTx0aGlzLnhkLmxlbmd0aDthKyspdGhpcy54ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkJ0LmJpbmQodGhpcykpfSxCdDpmdW5jdGlvbihhKXt0aGlzLnlkLS07YSYmdGhpcy5UZS5wdXNoKGEpOzA+PXRoaXMueWQmJnRoaXMudWgoKX0sZ3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVGUubGVuZ3RoO2MrKyliPXRoaXMuVGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMubGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm9pPXRoaXMuYVs2XTt0aGlzLlZyPXRoaXMuYVsxMF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubnc9dGhpcy5hWzVdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMua3c9dGhpcy5hWzFdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMub209dGhpcy5hWzFdO3RoaXMudXM9dGhpcy5hWzhdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5ycz1iO2IucHJvdG90eXBlPXtuaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2k6dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZyOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qajp0aGlzLmx3KGEpfSxsdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnc6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF2OnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5rdzp0aGlzLnh3KGEpfSx4dzpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnl3OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vbTp0aGlzLnRzKGEpfSx0czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXM6dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5yc3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQubmkoNCl9KS5jYWxsKGNlaVF1YWVmaGFpQnV4YWUsY2VpUXVhZWZoYWlCdXhhZSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
52.84.163.227
Seattle, United States,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- server-52-84-163-227.txl51.r.cloudfront.net
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/96c1e2da978d5dc14f58465c94ba6bc72a3cca81/
Frame 4650
|
653 B
1 KB
|
2571ms
84ms
|
XHR
application/json |
136.243.244.75
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/96c1e2da978d5dc14f58465c94ba6bc72a3cca81/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGNlaVF1YWVmaGFpQnV4YWU9Y2VpUXVhZWZoYWlCdXhhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5aYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5zbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5hZCxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlJhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuYmYoYyk7YS5qdShsKTthLml1KG0pO2EuVXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkliLmxlbmd0aCl7dmFyIGE9bC5JYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG49dGhpcy5hWzZdO3RoaXMuTHA9dGhpcy5hWzZdO3RoaXMueG09dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5IcD1iO2IucHJvdG90eXBlPXtDbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG46dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSHB8fGhhLHJjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zbz0hMTt0aGlzLlhiPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQXQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLk5nPXt9O3RoaXMuWmU9ITF9Yy5Gaj1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LEFjOmZ1bmN0aW9uKCl7dGhpcy5aZXx8KHRoaXMuWmU9ZS5hYSgxMCkpO3JldHVybiB0aGlzLlplfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuTmdbYV0mJih0aGlzLk5nW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLAp0aGlzLkh1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnp0KGEuZGF0YSl9LAp6dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LGxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudHEoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmVoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KbmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sa246ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy52YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmVxKGEpKXJldHVybjsoYj10aGlzLmxnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT0KYX19LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxmYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHNlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sQ2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6CiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxKaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxXZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LHplOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCwKZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOwowPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZShhKX0uYmluZCh0aGlzKSwxMDApfSxHYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDwKYTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9CjA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHQucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLQo4XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt4PWs7dT1sO3I9bTtmb3IoZj0wOzE5Pj1mO2YrKylwPWQocSw1KSsobiZ4fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrCmIoZykrYihrKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7CnJldHVybiBifSxGcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5SYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxTYTpmdW5jdGlvbigpe3ZhciBhPXtDaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxacTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSwKQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEFrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxobzpmdW5jdGlvbigpe3JldHVybiBhLkNpKCl8fGEuSmkoKXx8YS5acSgpfHxhLkNsKCl8fGEuT20oKXx8YS5BaygpfHxhLiRsKCl9fTtyZXR1cm4gbnVsbCE9YS5obygpfSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEJjOmZ1bmN0aW9uKGEpe2E9dGhpcy52YShhKS5ob3N0LnNwbGl0KCIuIik7CnZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LENxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudmEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxmcDpmdW5jdGlvbihhLApiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sQ3U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuWGgoYikrIjoiK3RoaXMuWGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxhZjpmdW5jdGlvbihhKXt0aGlzLlhiPQphfSx2ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlhiO3RoaXMuVmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHljOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLllhKGIsZCkpO2ImJihCPWsuWWEoYSxiKSk7ZiYmKEI9ay5ZYShCLGYpKTtxJiYoQj1rLllhKEIscSkpO2MmJihCPWsuWWEoQixjKSk7ZyYmKEI9ay5ZYShCLGMpKTtlLnljKEIpfSxDdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmCjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTtiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DdChhKTtpZihiKWlmKCFsfHwKIWwuWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuemQoKTtsLnhhKGEsITApO2E9bC54YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pOwp0aGlzLk1jW2ZdfHwodGhpcy5NY1tmXT0wKTt0aGlzLk1jW2ZdKys7MTA8dGhpcy5NY1tmXXx8KGY9bC56ZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC54YShmLCEwKSxmPWwueGEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsCihmWzBdP2ZbMF06IiIpKyhmWzFdP2ZbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sR2U6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuRm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxxZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMua2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmxkKGEpOiIifSxsZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSwKYixkLGYpe2Q9ITE7aWYoYi5CZShhKXx8dGhpcy5KcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LlllJiZ3aW5kb3cuc2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7CmQmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLlphKGEsYi5IYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5vZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5rbihlLGEpO3JldHVybiBlfSxaYTpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godGMpe2ModGMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7CmVsc2V7bS54YShhLGUpO2U9bS54YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uSWEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYKMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LCRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLktjKWZvcih2YXIgYyBpbiB0aGlzLktjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuS2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKToKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYSxmLkhhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy4kcihmLm9kKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LYz1hfSx3dzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuWmEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTsKZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0saW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxEcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5Ganx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Faj1iO2IuWWE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnB0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLk1wPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iuc3c9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5MZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuUWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuVWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmNuPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkh2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaGc9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Vbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmJkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuYWQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlNmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5lbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUmM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLldkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLllkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuZG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmRpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuQnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5zZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi5wZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuaWc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmN3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkR2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIuRXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkN2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpO3ZhciBrPWMuRWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnc9dGhpcy5hWzhdO3RoaXMuZW89dGhpcy5hWzNdO3RoaXMudGk9dGhpcy5hWzRdO3RoaXMuVGo9dGhpcy5hWzhdO3RoaXMubW09dGhpcy5hWzldO3RoaXMuY3I9CnRoaXMuYVsyXTt0aGlzLnNyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLnJuPWI7Yi5wcm90b3R5cGU9e2V3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mdzp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZW86dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50aTp0aGlzLlNqKGEpfSxTajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVGo6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1tOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jcjp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLnJufHxqYSx1Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuZXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Haj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHhxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lKwpuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxqZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuamQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5qZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudWUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5qZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sVGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLnhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuamQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuR2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXc9dGhpcy5hWzNdO3RoaXMuQXA9dGhpcy5hWzJdO3RoaXMuYXY9dGhpcy5hWzEwXTt0aGlzLnZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs0XX1jLmR1PWI7Yi5wcm90b3R5cGU9e3p3OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuQXc6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFwOnRoaXMuJHUoYSl9LCR1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmR1fHxrYSx2Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy56dyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuUWk9Yn0pKGMpO3ZhciBMPWMuUWl8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGk9dGhpcy5hWzddO3RoaXMuaGo9dGhpcy5hWzEwXTt0aGlzLnpuPXRoaXMuYVs0XTt0aGlzLnJpPQp0aGlzLmFbOV07dGhpcy5Ucj10aGlzLmFbOV07dGhpcy50bj10aGlzLmFbMTBdO3RoaXMuT2s9dGhpcy5hWzNdO3RoaXMua289dGhpcy5hWzVdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuS249dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy53bD1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTGk6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhqOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bjp0aGlzLnBpKGEpfSxwaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucmk6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRyOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG46dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmtvOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jdDp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLndsfHxsYSx3Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuS2E9e307dGhpcy5JPW51bGw7dGhpcy5IYz0xMDA7dGhpcy5IYj0wO3RoaXMuVGE9MTUwO3RoaXMuS2I9MDt0aGlzLmt1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYT8odGhpcy5IYisrLHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuSGMpKTowPnRoaXMuVGEmJih0aGlzLktiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IYj50aGlzLlRhPyEwOiExfSxYZTpmdW5jdGlvbigpe3RoaXMuSGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGt1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5LYVtiLmphKCldPWI7TSYmTS5haCYmTS5HdShiKX0sV3c6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZSh0aGlzLkthKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9LEVyOmZ1bmN0aW9uKGIpe2I9Yi5HYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkthKWlmKGIuaWQ9PQp0aGlzLkthW2FdLkdhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG54OmZ1bmN0aW9uKGIpe3RoaXMuS2FbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBwPWMuTmx8fHA7KGZ1bmN0aW9uKGMpe2MuUGw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5IYz0xMDt0aGlzLkhiPTA7dGhpcy5UYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLm5nPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuR2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTGE6ZnVuY3Rpb24oKXt9LApzdTpmdW5jdGlvbihiKXt0aGlzLlc9Yn0sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XfSxudTpmdW5jdGlvbihiKXt0aGlzLkplPWJ9LFZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmV9LEllOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYSYmKHRoaXMuSGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkhjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHB4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlFxKCl8fHRoaXMuZm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxKYTpmdW5jdGlvbigpe3JldHVybiExfSxmeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEljOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRWg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSx6aDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sJHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGt4OmZ1bmN0aW9uKCl7dGhpcy5uZ3x8KHRoaXMubmc9ITApfSxwZTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5QbHx8dDsoZnVuY3Rpb24oYyl7Yy5taT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkhmPSIxIjt0aGlzLklmPSIyIjt0aGlzLlptPSIzIjt0aGlzLk9jPTA7dGhpcy5paD0KMzA7dGhpcy5QYj1bXTt0aGlzLmdiPVtdO3RoaXMubWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuV2Y9dGhpcy4kaD0hMTt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5iZihiKTt0aGlzLmx1KGEpfSxnOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3RoaXMuJGh8fCh0aGlzLiRoPSEwLGUuR2UoKSl9LE5lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5ZYiYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9CmUuQWMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLkFjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT0xfSxCcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldLmluaXRpYXRvciE9ZS5BYygpJiYodGhpcy5jZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnVhKCkpe3RoaXMudnIoKTtpZighdGhpcy5CcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5jZigpO3JldHVybn10aGlzLmNmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5UaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLAphKXt0aGlzLnVhKCl8fCh0aGlzLlBiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sVGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1lLnVuaXF1ZSh0aGlzLlBiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5tY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm1jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMubWNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLApiLCEwLGEpfX0sWnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSGZ9LGNmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0scXU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlptfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuT2N9LE5mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkhmfSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5JZn0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuT2N9LGJmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sbHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LHZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sY3M6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLm1pfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbN107dGhpcy5KbD10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMTBdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuZXA9YjtiLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zbjp0aGlzLklsKGEpfSxJbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkpsOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tcDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc206dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFxOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7CnZhciBuYT1jLmVwfHxuYSx4Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Ybig0KTsoZnVuY3Rpb24oYyl7Yy5waj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5wanx8b2E7KGZ1bmN0aW9uKGMpe2MucWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLkl3O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMucWp8fHBhOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLnJqfHxxYTsobmV3IHFhKHIpKS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm1sPWI7Yi5wcm90b3R5cGU9e2hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLm1sfHxyYSx5Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ocig0KTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3RoaXMuc2coKTt0aGlzLnVnKCk7dGhpcy5Ubz0hMX0sc2c6ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuWmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5aYil7dmFyIGI9dGhpcy5HYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuWmI9ITApO3RoaXMuWihhKX19LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sSWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkplJiYoMCx0aGlzLkplKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5oa3x8c2E7KGZ1bmN0aW9uKGMpe2MuZ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuWGQ9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5QYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJgohdGhpcy51YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMucmEoKSx0aGlzLmdldFBsYXllcigpLlRvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS52ZCgpLGEua2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUGM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5OZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlFjLmluZGV4T2YoYSkmJgp0aGlzLlFjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5RYy5sZW5ndGg+PXRoaXMuWGQmJnRoaXMubSgpKX0sY3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5uZT90aGlzLm5lKys6dGhpcy5uZT0xOnRoaXMubWU/dGhpcy5tZSsrOnRoaXMubWU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSmgoYS52aWRlb1RhZyk/YS5aYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlBjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuWmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5na3x8dGE7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ycSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkVyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sVHc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnJxOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5pa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVqPXRoaXMuYVsyXTt0aGlzLnh1PXRoaXMuYVs2XTt0aGlzLnprPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMuVW49YjtiLnByb3RvdHlwZT17ZGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVqOnRoaXMud3UoYSl9LHd1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54dTp0aGlzLnlrKGEpfSx5azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuems6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlVufHx3YSx6Yz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuZGooNCk7KGZ1bmN0aW9uKGMpe2MuR209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVihhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0KYi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuVyYmdGhpcy5XKCl9LHllOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0scWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLkdtfHx4YTsoZnVuY3Rpb24oYyl7Yy5GbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRGM9dGhpcy55YT10aGlzLlVjPSExO3RoaXMudmg9ZS5HYigxMCk7dGhpcy5aaD0hMDt0aGlzLnJjPXRoaXMuUWc9ITE7dGhpcy54cyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLkNvKCksdGhpcy5xYigpKX0seHM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuemEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5YLCI7Iix0eXBlb2YgYi5YLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlg/Yi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5YP3R5cGVvZiBiLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRWE/Yi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5FYT90eXBlb2YgYi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLkVhP2IuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouRWE/dHlwZW9mIGIuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouVWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRGN9LENyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQXIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlVjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5VYz0hMCk7cmV0dXJuIHRoaXMuVWN9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5WYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5SdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LFJ0OmZ1bmN0aW9uKCl7dGhpcy5yYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGUuemEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sU3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSwKQ286ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxkZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlkpaG9tYWRVdGlscy5SYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkNyKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuVmIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuVmIoKSx0aGlzLnJjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMudygpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuVmIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5CYSgpO2JyZWFrfX0sRG86ZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy53Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMud2MhPWIuYWRzLnN0YXRlJiYodGhpcy53Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy53Yyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLndjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EbygpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQmE6ZnVuY3Rpb24oKXswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMudWEoKXx8KGJ8fCh0aGlzLlpoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLlpoLGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxJbzpmdW5jdGlvbigpe3RoaXMuYXh8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuUXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5XdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxXdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5GbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuS2god2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLktoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LEtoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnNlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubWF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgemE9Yy5IbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRrPXRoaXMuYVs0XTt0aGlzLmZrPXRoaXMuYVs0XTt0aGlzLnF3PXRoaXMuYVsxXTt0aGlzLnZsPXRoaXMuYVsyXTt0aGlzLnZ1PXRoaXMuYVs5XTt0aGlzLmpsPXRoaXMuYVs0XTt0aGlzLkJ1PXRoaXMuYVs1XTt0aGlzLm9qPXRoaXMuYVs0XTt0aGlzLkNqPQp0aGlzLmFbNF07dGhpcy5nbT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLlppPWI7Yi5wcm90b3R5cGU9e3NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50azp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZms6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnF3OnRoaXMudWwoYSl9LHVsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bDp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnU6dGhpcy5pbChhKX0saWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpsOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2o6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMuZm0oYSl9LGZtOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuZ206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5aaXx8QmEsQWM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuRWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5QZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sd3Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMuamEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuWWImJigwPD1oLmluZGV4T2YoZCl8fGEudmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlBlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLlBlKys7aWYoMTA8dGhpcy5QZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7CnZhciBDYT1jLkVsfHxDYTsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe2lmKCF0aGlzLm9lKWlmKHRoaXMuQ2J8fCh0aGlzLkNiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuQ2IrKywxNTx0aGlzLkNiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMub2U9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCl9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnlhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5VcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLlVwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2Iud3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuRGx8fERhOyhmdW5jdGlvbihjKXtjLkZsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVGE9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubWF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLkZsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuYm49dGhpcy5hWzhdO3RoaXMub3A9dGhpcy5hWzFdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOV19Yy5FbT1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXA6dGhpcy5hbihhKX0sYW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcDp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLnJ0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5FbXx8R2EsQmM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy55dD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PQpiLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnl0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuZ2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5nZCl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5XZyh0aGlzLmdkKTtlLnplKHRoaXMuZ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLAo1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmFrfHxIYTsoZnVuY3Rpb24oYyl7Yy4kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy4kanx8SWE7KGZ1bmN0aW9uKGMpe2MuYms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5UYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuQ2coYiwiZWxlbWVudElEIik7aWYoZS5XZyhhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5LYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5LYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIEphPWMuYmt8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xcz10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzVdO3RoaXMuUGk9dGhpcy5hWzFdO3RoaXMuJHQ9dGhpcy5hWzNdO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbN119Yy56bz1iO2IucHJvdG90eXBlPXtWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmltOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJHQ6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuem98fExhLENjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLlZzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Iaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxtdTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGduOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuSGp8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5lYj1hO3RoaXMueGc9CnRoaXMuaGk9ITE7dGhpcy5taD1kO3RoaXMuTGg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZWI9bmV3IHooYSkpO3ZhciBjPXRoaXMuc2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJmwmJmwuQ2UodGhpcy5lYi51cmwpJiZsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5tdSgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmthKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LApmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLklqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmViLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLnhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5MaD90aGlzLnNiLm9wZW4odGhpcy5lYi5tZXRob2QsdGhpcy5lYi51cmwsITEpOnRoaXMuc2Iub3Blbih0aGlzLmViLm1ldGhvZCx0aGlzLmViLnVybCwhMCksdGhpcy5oaXx8KHRoaXMuc2Iud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLAphWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5zYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuQ2UodGhpcy5lYi51cmwpP2wuS2Q/bC5rYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5DZSh0aGlzLmViLnVybCksdGhpcy5taCYmdGhpcy5taCgpfXJldHVybiB0aGlzLnNifX19KShjKTt2YXIgTWE9Yy5Janx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJhPSExO3RoaXMudWM9IiI7dGhpcy5jZT10aGlzLnRjPXRoaXMud2I9bnVsbDt0aGlzLmdwPXRoaXMuSWI9dGhpcy5kaD0hMTt0aGlzLkhhPSIiO3RoaXMuWWc9ITE7dGhpcy5EYT10aGlzLm1kPSIiO3RoaXMuVWc9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLktnPXRoaXMuY2M9IiI7dGhpcy5sZT0hMTt0aGlzLm1mPTA7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjsKdGhpcy5BZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuT2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmVjPSIiO3RoaXMuZmM9W107dGhpcy5nYz1bXTt0aGlzLklkPVtdO3RoaXMuZGM9IiI7dGhpcy5uZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNjPSExO3RoaXMuSm89dGhpcy5NZD1udWxsO3RoaXMuR2g9dGhpcy5qYz10aGlzLnBnPXRoaXMucWY9dGhpcy5LZD10aGlzLmZlPXRoaXMuVmQ9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5uZD0wO3RoaXMuTWc9ITE7dGhpcy5MZz0xRTM7dGhpcy5XYz0hMTt0aGlzLk9hPTFFMzt0aGlzLktmPSIifWMuSmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuUmEsCmFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuZGgsc2lkZWxvYWRzOnRoaXMuSWIsZGlzYWJsZXRlc3RzOnRoaXMuZ3AsaG9tYWRBbGlhczp0aGlzLkhhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5ZZyxnbG9iYWxDb25maWc6dGhpcy5tZCxjbGllbnRDb25maWc6dGhpcy5EYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlksaXNCbG9ja2VkOnRoaXMuVWcsc2VydmVyOnRoaXMuQWEsc3ZtQ29uZmlnOnRoaXMuY2MsaG9tYWRBZHBhdGg6dGhpcy5LZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmxlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm1mLEhPTUFEX1ZFUklGSUVEOnRoaXMuQ2YsSE9NQURfQkxPQ0tFRDp0aGlzLkFmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLk9iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmxjLApIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuQmYsdGVzdEhpZGU6dGhpcy5lYyx0ZXN0VGFnczp0aGlzLmZjLHRlc3RUYWdzSlM6dGhpcy5nYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5kYyx0aHJvdHRsZTp0aGlzLm5mLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuQ2MsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlZkLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5mZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5LZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5xZixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5iYixzZXJ2ZXJJZDp0aGlzLkRoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmpjLHNraXBBbGxvd2VkOnRoaXMuR2gsdm1hcHM6dGhpcy5laSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuV2MsYWRGYWxsYmFja1VSTDp0aGlzLktmfX0sCk9xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0sc3E6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLApkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5pbyhhKX0seGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlJhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkJlKGEpO2M9dGhpcy52YShhKTtmPyh0aGlzLnBkKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnpkKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMudWN8fHRoaXMud2J8fHRoaXMudGN8fHRoaXMuY2UpJiYoZz10aGlzLmtzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMudXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PQpnO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLnBkKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxwZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5BYSYmdGhpcy5BYS5sZW5ndGgmJjA8dGhpcy5BYS5sZW5ndGgmJihiPXRoaXMuQWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPQpiLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuQmUoYSk7cmV0dXJuIGJ9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5IYSYmMDx0aGlzLkhhLmxlbmd0aClyZXR1cm4gdGhpcy5IYTtmb3IoZCBpbiB0aGlzLkhhKWlmKGI9dGhpcy5IYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk53O3JldHVybiJub25lIn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BYVt0aGlzLkRoXX0semQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9kKCksYj10aGlzLkZoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLApiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxqczpmdW5jdGlvbihhLGIpe3ZhciBkPWUudmEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEg9MDtIPGcubGVuZ3RoO0grKyl7dmFyIGs9Z1tIXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLmpoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9CnRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxrczpmdW5jdGlvbihhKXt0aGlzLnVjJiYoYSs9dGhpcy51Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy50YyYmKGE9dGhpcy5qcyhhLHRoaXMudGMpKTtyZXR1cm4gYX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bD10aGlzO3RoaXMuWWc9ITA7dGhpcy5tZD1hO3RoaXMuRGE9Yjt0aGlzLlZlPWQ7dGhpcy5NZD1mO3RoaXMueGM9Yzt0aGlzLmJiPWV8fHt9O3RoaXMuWnIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuRGEpdGhpcy5YcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5EYSl0cnl7dGhpcy5EYT0KYigpLHRoaXMuWmMoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFpyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLm1kK3RoaXMuJGQoImdsb2JhbCIpKSx0aGlzLktxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLiRlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuWmMoKX0uYmluZCh0aGlzKSwhMCl9LFhyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLkRhK3RoaXMuJGQoImNsaWVudCIsLTEhPXRoaXMuRGEuaW5kZXhPZigiPyIpKSksdGhpcy5aYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy4kZSgiY2xpZW50Iik7dGhpcy5rYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5HYigpKTt0aGlzLmJiJiZ0aGlzLmJiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5iYiYmdGhpcy5iYi5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGthOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKXt0aGlzLmZlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnhjPSExKTt0aGlzLnhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueGM/dGhpcy54YygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuVWc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkFmKSk7dGhpcy5MYigpO2UueWMoay5wdCk7KGI9ZS5CYyh0aGlzLm9kKCkpKXx8KGI9ZS5CYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sS3E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkRhfHx0aGlzLmNjfHx0aGlzLkhhfHx0aGlzLlpjKCk6KHRoaXMuUmE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLk9iKSksdGhpcy5MYigpKX19LFpjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLkRhfWVsc2UgYT10aGlzLkRhO3RoaXMuaXNFbmFibGVkPXRoaXMuaGMoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLmNjPWEuY29uZmlnfHwiIjt0aGlzLkhhPWEuYWxpYXN8fG51bGw7dGhpcy5LZz1hLmFkcGF0aHx8IiI7dGhpcy5sZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkRoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuY2MmJnRoaXMuSGEmJnRoaXMuQWEubGVuZ3RoP3RoaXMuRWMoITEpOih0aGlzLlJhPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLkxiKCkpfSxFYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLnpkKCkpLGQ9dGhpcy52YSh0aGlzLmNjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuY2MrdGhpcy4kZCgiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMuSnUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuJGUoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMua2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwKMTAwKSk6dGhpcy5FYyghMCl9LmJpbmQodGhpcyksITApfX0sSnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5DYz0hMDt0aGlzLkVjKCEwKTtyZXR1cm59fXRoaXMuS2Q9dGhpcy5oYyhiLnN0cmljdCk7dGhpcy5xZj10aGlzLmhjKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnBnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmhjKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuZWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5nYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy51Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8Cm51bGw7dGhpcy50Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZGg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5JYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1iLnZwYWlkfHwhMTt0aGlzLmJiLnZwYWlkPXRoaXMuamM7dGhpcy5HaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlhjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5laT1iLnZtYXBzfHwiIjt0aGlzLldjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1iLmJpdHJhdGV8fDFFMzt0aGlzLktmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmRjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuQnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmxlJiYodGhpcy5kYz1udWxsKTt0aGlzLm5mPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPQpiLnZpZGVvcGxhemF8fHt9OyF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5DYz0hMCx0aGlzLkVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmJ2KCkmJih0aGlzLmVjfHx0aGlzLmdjfHx0aGlzLmZjfHx0aGlzLmRjfHx0aGlzLklkKT90aGlzLlZlPyh0aGlzLlJhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMuaGUoKSx0aGlzLkxiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5PdSgpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuUHUoKX0sUHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUuZmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMuYmImJnRoaXMuYmIucGxheWVyJiZ0aGlzLmJiLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5rYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLkxiKCl9LExjOmZ1bmN0aW9uKGEpe3RoaXMuVmQ9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLkxiKCksdGhpcy5oZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmVjKXt2YXIgYT1lLmZkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5iaCgpKXRoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5lYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuUGgoKX19ZWxzZSB0aGlzLlBoKCl9LE9oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkdiKCkpO3RoaXMuU3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmpmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MYyh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmZjPXRoaXMuSWQpJiZ0aGlzLmZjLmxlbmd0aCl7dmFyIGQ9dGhpcy5mYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmpmKCl9LFN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxQaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigpKTt0aGlzLlR1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5PaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuZ2MmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZD10aGlzLmdjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuT2goKX0sVHU6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxqZjpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMubWYrKyx0aGlzLklhKG5ldyB6KHRoaXMuZGMpLHRoaXMuTHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5NaCgpfSxrZjpmdW5jdGlvbihhKXt0aGlzLkxjKHRoaXMuQmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxMdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5tZj90aGlzLmpmKCk6dGhpcy5rZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuTWgoKTp0aGlzLmtmKCJBQUEiKX0sTWg6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTsKdGhpcy5MYigpO3RoaXMuaGUoKX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxMYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5TYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlZkJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS56YSgidC1vbmxpbmUuZGUiKXx8ZS56YSgiZ2lnYS5kZSIpfHxlLnphKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmJoKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkNmKSk7dGhpcy5NZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk1kJiZ0aGlzLk1kKCl9LEdvOmZ1bmN0aW9uKCl7aWYodGhpcy5xZiYmCnRoaXMuT3EoKSl7dmFyIGE9dGhpcy5zcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sVGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5uZHx8KHRoaXMubmQ9MCk7dGhpcy5uZCsrO3RoaXMubmQ+dGhpcy5MZyYmIXRoaXMuTWcmJih0aGlzLk1nPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5MZywhMCkpO2E9bmV3IE1hKGEsYixkKTtmJiYoYS5oaT0hMCk7YyYmZS5GcigpJiYoYS54Zz0hMCk7ZyYmKGEuTGg9ITApO3JldHVybiBhLmxvYWQoKX0sRW86ZnVuY3Rpb24oKXtlLlNhKCl8fGUuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmthKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnBkKCl8fChhPXRoaXMudmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZWl9LEZvOmZ1bmN0aW9uKCl7dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkd2LmJpbmQodGhpcyksdGhpcy5Gdi5iaW5kKHRoaXMpKX0sR3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLk9wKCl9LEZ2OmZ1bmN0aW9uKCl7fSxPcDpmdW5jdGlvbigpe2UueWMoay5OcCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5rYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0saGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkliLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkliW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlphKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5pYSgpXT10aGlzO2UuWmEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5uZn0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEdiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0saGM6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEZoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsaCxjO2ZvcihoPTc7MDw9aDtoLS0pYz1hPj4+NCpoJjE1LGQrPWMudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGU9QXJyYXkoODApLGc9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHI9MzI4NTM3NzUyMCxuLHAsdSx0LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj0KYS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGYpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyllW2ZdPXdbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspZVtmXT1kKGVbZi0zXV5lW2YtOF1eZVtmLTE0XV5lW2YtMTZdLDEpO2M9ZztuPWs7cD1sO3U9bTt0PXI7Zm9yKGY9MDsxOT49ZjtmKyspdj1kKGMsNSkrKG4mcHx+biZ1KSt0K2VbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj00MDs1OT49ZjtmKyspdj1kKGMsNSkrKG4mcHxuJnV8cCZ1KSt0K2VbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NjA7Nzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2c9ZytjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7cj1yK3QmNDI5NDk2NzI5NX1yZXR1cm4oYihnKStiKGspK2IobCkrYihtKStiKHIpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5Kanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaXA9CnRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLlprPXRoaXMuYVsxMF07dGhpcy5vbz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs5XX1jLk5yPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLnBzKGEpfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXM6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlwOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ldDp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWms6dGhpcy5ubyhhKX0sbm86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgT2E9Yy5Ocnx8T2EsRGM9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkxxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5QP3RoaXMuJGE9YS5mLlAoKTp0aGlzLiRhPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnZkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuQmguYmluZCh0aGlzKSxtdXRlOnRoaXMuS2UuYmluZCh0aGlzKSx1bm11dGU6dGhpcy50di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVGI9dGhpcy5WYz0hMTt0aGlzLmZvPTFFMzt0aGlzLnBhPW51bGw7dGhpcy5MPWI7dGhpcy5OYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMucm89ZS5hYSgxMCk7dGhpcy5mZj0wO3RoaXMuVGM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5UYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJgooKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuVGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubm49ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5uaD10aGlzLkVkPSExO3RoaXMuZ2g9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLlpkPSExO3RoaXMuV2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5ZYj0hMTt0aGlzLlZvPWUuYWEoMTApO3RoaXMuRmI9ZS5hYSgxMCk7dGhpcy5EYj1lLmFhKDEwKTt0aGlzLkhoPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5qZT10aGlzLmNkPXRoaXMuaGY9dGhpcy5yYj10aGlzLmtjPXRoaXMucGg9dGhpcy5oZD10aGlzLmN2PXRoaXMudWI9dGhpcy5FYj0hMTt0aGlzLnBjPVtdOwp0aGlzLiRiPXt9O3RoaXMuaHQ9MjAwO3RoaXMueGY9dGhpcy55Zj10aGlzLmVlPXRoaXMud2Y9dGhpcy5VZT0hMTt0aGlzLnVkPXt9fWMuRGo9YjtiLnByb3RvdHlwZT17aHU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy4kYV0mJnRoaXMuY29uZlt0aGlzLiRhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuJGFdW2FdKTtyZXR1cm4gYn0sVWg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuWGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLkdkKCJjYWxsIix0aGlzLldhKCkpO2UudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEZlOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMudWI9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlkpdGhpcy5mZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLAp0aGlzLkwuR28oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlJhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlVoKCksbmV3IFModGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuVWgoKSxuZXcgUyh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKToKdGhpcy5QYSgpO2Vsc2V7dmFyIHNjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3NjLkZlKGEsYixkKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7YS5YYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5oZD0hMTt0aGlzLmM9YTt0aGlzLnR1KHRoaXMuYyk7dGhpcy51ZD1uZXcgUGEodGhpcy5jLkl2LHRoaXMudmlkZW8se30pO3RoaXMuSGcoYSk7dGhpcy5wYz10aGlzLnpnKGEpO3RoaXMuUW8oKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5FcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ucShhKSkpOwpyZXR1cm4gY30sbnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LEVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0KMDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlhhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZWQmJmEuZWQuZXJyb3ImJmEuZWQuZXJyb3IuY29kZSYmKGI9YS5lZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk5jLmNvZGU6Yj09Ri5SZC5jb2RlP2UudihrLmR3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSwKdGhpcy5CKCksdGhpcy5DKCkpOihlLkdlKCksYj09Ri5GZi5jb2RlJiZlLnYoay55cyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay5NcCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuR2QoImVtcHR5Iix0aGlzLldhKCkpO3RoaXMuVWEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5HZi5jb2RlOmUudihrLm93LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuc3csdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudihrLnpzLHRoaXMuYy5BLAp0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay5Edix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuemYuY29kZTplLnYoay5Fdix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5VYihhKTt0aGlzLlBhKCl9LFViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgYz1hLk5hLnBvcCgpO3RoaXMuRWUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHR1OmZ1bmN0aW9uKGEpe3RoaXMuamU9ITE7dGhpcy5OYj10aGlzLmIuSzsKdmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuTmIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlVlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXg9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTsKdGhpcy5ubiYmdGhpcy5wbGF5ZXIucGUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnBlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5obihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuVWUmJmIubG9hZCgpO2lmKHRoaXMuUWgoYikpe3RoaXMuR2QoInNldHVwIix0aGlzLldhKCkpO3RoaXMubG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlVlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPQp0aGlzLnBhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUm8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5wYS5hcHBlbmRDaGlsZChiKSx0aGlzLnJ1KCkpOnRoaXMuYy5vcmlnaW4ucWcody5RZCl9LHJ1OmZ1bmN0aW9uKCl7dGhpcy53Zj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmI9ITApO2UuaWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJmUubW4odGhpcy5jLm9yaWdpbi5zYSk7CmUuZmIoInNldFVwVnBhaWQiKTt0aGlzLkdkKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnFoKCk7dGhpcy5iLmRmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5kZigpO3RoaXMucGE9dGhpcy5OYj10aGlzLmIuSzt0aGlzLmFpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5KYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuSHEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmFlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLldiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnBjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuU3YoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5UdigpLHRoaXMuYi5XYighMCksIXRoaXMuTWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuTWI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkFlKHRoaXMuTWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5XYighMCksdGhpcy5YdigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuV2IoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWnYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuJHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5idygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5TYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5oZyx0aGlzLmMuQSwKdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLldjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy55ZiYmKHRoaXMueGY9ITEsdGhpcy5iYygpKSx0aGlzLlZ2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnJiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5KYigibXV0ZWQiLCJ1c2VyIiksZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkpiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnBmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLllkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLmFlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5YZihmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5XZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5rYz0hMH0sVnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMua2M9ITF9LFh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sCld2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlNmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZmIoImltcHJlc3Npb24iKTt0aGlzLkloKCk7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZmIoInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxadjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmhkPSEwO2UuZmIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sJHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpOwplLmZiKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5mYigidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMuc2YoKTtlLmZiKCJjb21wbGV0ZSIpO3RoaXMuVmEoImNvbXBsZXRlIil9LGZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZmIoImFkc3RvcHBlZCIpO3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuaWUoKTsKdGhpcy5IPSExO3RoaXMuUGEoYSl9fSxTdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLmZiKCJlcnIiLGIpO2UudihrLmN3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5maSghMCl9LGhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuUmEmJmIuaXNFbmFibGVkJiYhYi5wZCgpKXt2YXIgZD1iLnZhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsCnRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuTnYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxRaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sbG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuYmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxiaTpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGJ8fHRoaXMudWYoYSl9LmJpbmQodGhpcyksdGhpcy5mbykpfSx1ZjpmdW5jdGlvbihhKXtpZighdGhpcy5WYyYmdGhpcy5RaCh0aGlzLnZpZGVvKSYmIXRoaXMuRWImJiF0aGlzLlRiKXt0aGlzLlZjPSEwO3RyeXtpZighZS5TYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRWJ8fCh0aGlzLkViPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMuS3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5kZigpO3RoaXMuSnYoKTt0aGlzLmFpKCk7dGhpcy5hZygpO3RoaXMuYi5xaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5nZigpfX0sZ2Y6ZnVuY3Rpb24oKXt0aGlzLmNkfHx0aGlzLk1mKCl9LE1mOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuY2R8fChhP3RoaXMuUGEoKToodGhpcy5LZSghMCksdGhpcy5NZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmFjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0uYmluZCh0aGlzKTt0aGlzLnJlKCkuRWgodGhpcyl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5FYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLmNuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5QYSgpfSxQYTpmdW5jdGlvbihhKXtpZighdGhpcy5qZSlpZih0aGlzLmplPQohMCx0aGlzLk5kfHwoZS52KGsuQnMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5uYyl7ZS5vYigibmV3U21hbGxBZElkIik7dGhpcy5mZisrO3RoaXMuVGI9dGhpcy5WYz0hMTt0cnl7dGhpcy5BZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLk5iLnJlbW92ZUNoaWxkKHRoaXMucGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5ZaCgpfWNhdGNoKGcpe310aGlzLmhmPSEwO3RoaXMuYi52ZSgpO3RoaXMuWWI9ITE7dGhpcy5yZSgpLnpoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLkxlKCk7dGhpcy5jLm5jJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5rZSgpKX1lbHNlIHRoaXMua2UoKX0sTnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7CnRoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50ZihhKSl9LHRmOmZ1bmN0aW9uKGEpe3RoaXMuVGI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLkVvKCk7dGhpcy5jLm9yaWdpbi5xZyh3LlFkKX0sY2k6ZnVuY3Rpb24oKXtpZih0aGlzLmN2KXRoaXMuUGEoKTtlbHNle3RoaXMuWWI9ITA7dGhpcy5iLmYuSmEmJiF0aGlzLmhmJiZ0aGlzLmIuZi5KYSgpJiZlLnYoay5hZCx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5mdihhKTtpZighdGhpcy5NYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmCih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5NYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuQWUodGhpcy5NYil9Yz0iIjt0aGlzLmMuZWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGgpKSYmKGM9dGhpcy5jLmVmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSwKdGhpcy5FZHx8KHRoaXMuRWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMudGI/KHRoaXMuVGI9dGhpcy5WYz0hMSx0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5OYi5yZW1vdmVDaGlsZCh0aGlzLnBhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLlloKCksdGhpcy5jLm9yaWdpbi5MZSgpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlRjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlpkPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxWaDpmdW5jdGlvbigpe3RoaXMucGh8fAoodGhpcy5waD0hMCx0aGlzLmhkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sZnY6ZnVuY3Rpb24oYSl7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLldofHx0aGlzLkVifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuVmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZoKCl9LmJpbmQodGhpcykpLHRoaXMuRWJ8fHRoaXMuSWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5WYSgic3RhcnQiKSxlLnYoay5PZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksCnRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5qYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmhkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5RZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLAoidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuV2g9YSl9LEdkOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxJaDpmdW5jdGlvbigpe2UudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLHRoaXMuV2EoKSwhMCl9LFVhOmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX2hkX2FkX2Vycm9yIixhLCEwKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMud2Z8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxKYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkViKXt0aGlzLnVkJiZ0aGlzLnVkLnRyYWNrJiZ0aGlzLnVkLnRyYWNrKGEpOwppZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5GcSh0aGlzLmMuTmEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRHIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5FZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZG4sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKGcudXJsLApnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuY3AodGhpcy5jLk5hLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWUuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLndmJiYoYj0iX3ZwYWlkIik7dGhpcy55ZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxFZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC54YShhKSxjJiZiLmduKGMpLGZ8fChmPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuam4oYSksdGhpcy5MLklhKGIsZnVuY3Rpb24oKXt0aGlzLnloKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGpuOmZ1bmN0aW9uKGEpe3RoaXMuJGJbYV09Im9wZW4ifSx5aDpmdW5jdGlvbihhKXt0aGlzLiRiW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuJGI9e319LEZ1OmZ1bmN0aW9uKCl7dmFyIGE9CjAsYjtmb3IoYiBpbiB0aGlzLiRiKXRoaXMuJGIuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy4kYltiXSYmYSsrO3JldHVybiBhfSxGcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGNwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEt2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mdi5iaW5kKHRoaXMpKX0sTHY6ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmJjKCk6dGhpcy5jLlNiJiYoZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KIl90b3AiO3RoaXMuTC5XYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5TYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuU2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxKdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLAphLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5UYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5YYyYmKGI9dGhpcy5MLlhjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnBhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJgp0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxhaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuVm87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuRmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5TaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuYmMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkRiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ldi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5kdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkhoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmVmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXToKKGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLnBhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5YZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi5xYSYmdGhpcy5iLmYucWEoKSYmKGUudihrLmlnLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5LZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGJjOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLnhmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuUmMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxTaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMua2M/KGUubGEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuSmIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwidXNlciIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMucmI/KGUubGEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sS2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwiY29udGVudCIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx0djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5KYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LGFjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmFjKTt0aGlzLmNkfHx0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0sa2U6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuZmQoKTshdGhpcy5MLmpjfHxlLlNhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5lZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5uaD8odGhpcy5jZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLmpnKCkpOih0aGlzLm5oPXRoaXMueWY9dGhpcy54Zj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKSx0aGlzLmVlPSEwLGE9ZS4kZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5GZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5GdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLHRoaXMuaHQpOih0aGlzLmhmPSEwLHRoaXMuYi52ZSgpLHRoaXMuYi5ZdCgpLHRoaXMuWWI9ITEsZS52KGsuVW8sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnJlKCkuemgoKSl9LHJlOmZ1bmN0aW9uKCl7dmFyIGE9Cm51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxhZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLnplKHRoaXMudmlkZW8sYSk/dGhpcy5CaCgpOnRoaXMudmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5TYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnBjJiYwPHRoaXMucGMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnBjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT0Ke307YS5hZHNlc3Npb25faWQ9dGhpcy5ybysiLSIrdGhpcy5mZjt0aGlzLmMmJnRoaXMuYy5EZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuRGcoKSk7cmV0dXJuIGF9LG9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5Eanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXY9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzZdO3RoaXMuY2w9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5WcT1iO2IucHJvdG90eXBlPXt4djpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXY6dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNpOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuVnF8fApSYSxFYz1uZXcgUmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy54dig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkNhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMub2M9dGhpcy5xYz0hMTt0aGlzLnNhPSIiO3RoaXMudmY9ITE7ZCYmZC5lbXB0eT90aGlzLmJzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuZmQoKSxiO2I9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7CmMmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOmwueGEobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLmxnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT0KY3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC54YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnhhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5hcy5iaW5kKHRoaXMpLHRoaXMuWXIuYmluZCh0aGlzKSl9LApBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5DYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuWGIpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7CnZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuQ2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLlhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5YYnx8dGhpcy5JcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5LdSgpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrCiciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtmW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxJcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmCmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGFzOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMuQ2E9YS5yZXNwb25zZVhNTCx0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuU2QpKX10aGlzLlg9dGhpcy5BZygpO3RoaXMucWM9dGhpcy5sZigpO3RoaXMub2M9dGhpcy5OaCgpOwp0aGlzLlgubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuUWEody5OYyx7ZXJyb3I6dGhpcy52Zj9GLlJkOkYuRWZ9KSl9LGJzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUWEody5TZCkpfXRoaXMuWD10aGlzLkFnKCk7dGhpcy5xYz10aGlzLmxmKCk7dGhpcy5vYz10aGlzLk5oKCk7dGhpcy5YLmxlbmd0aD90aGlzLkdjKCk6dGhpcy5vYSh0aGlzLlFhKHcuTmMse2Vycm9yOnRoaXMudmY/Ri5SZDpGLkVmfSkpfSxZcjpmdW5jdGlvbigpe3RoaXMub2EodGhpcy5RYSh3LkRmLHtkZXB0aDphfSkpfSxHYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLktyKCk/dGhpcy5VdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLklnKCksaCx7QWRTeXN0ZW06dGhpcy5tcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5vYSh0aGlzLlFhKHcuR2YpKTooYT0wLHRoaXMuQnYoKSYmdGhpcy5RZSh0aGlzLldvKCkpKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkdjKCkpOnRoaXMucGFyZW50LkxlKCl9LGtoOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5raCgpfSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ1KCk/dGhpcy5RdSgpPyEwOigtMSE9dGhpcy56YygpP3RoaXMub2EodGhpcy5RYSh3LlBkKSk6dGhpcy5vYSh0aGlzLlFhKHcuemYpKSwhMSk6KHRoaXMub2EodGhpcy5RYSh3Lk5jLEYuRmYpKSwhMSl9LFFlOmZ1bmN0aW9uKGEpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLk5hPWEuTmEuY29uY2F0KHRoaXMuSGUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWGE9CmEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuUWUoYSl9LFdvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLmR1cmF0aW9uPXRoaXMuemMoKTthLk89dGhpcy5GZygpO2EuU2I9dGhpcy5vcSgpO2EuSXY9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5scSgpO2EuZWY9dGhpcy5EcShhLmR1cmF0aW9uKTthLlhhPWEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLlhhPWIuWGE/Yi5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5OYT1iLmVycm9yLmNvZGUhPXcuUGQuY29kZT9iLk5hLmNvbmNhdCh0aGlzLnBxKCkpOmIuTmEuY29uY2F0KHRoaXMueXEoKSkpOwp0aGlzLlgubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5VYiYmdGhpcy5wYXJlbnQuVWIoYiksYT0wLHRoaXMuR2MoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxVYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5VYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUWEoYSxiKSl9LFFhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxSdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy56YygpfSxsZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxOaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMubGYoKSYmKGE9ITApO3JldHVybiBhfSxKdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMudmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sS3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LG1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxIZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0KIkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0seXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sCnBxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxvcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxPdzphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD0KYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5sZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxEcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkN1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubGQoYSk6IiJ9LGxkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9rPXRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVsxMF07dGhpcy5Qbz10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLlRwPWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMub2s6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhrOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qbzp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLlRwfHxVYSxGYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5uayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk5hPVtdO3RoaXMuTz1bXTt0aGlzLlNiPSIiO3RoaXMuQT10aGlzLm5jPXRoaXMudGI9ITE7dGhpcy53ZT10aGlzLm9yaWdpbj1udWxsO3RoaXMueGU9IiJ9Yy5NbD1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx3cTpmdW5jdGlvbigpe2lmKCF0aGlzLndlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkNhKXt2YXIgYT10aGlzLm9yaWdpbi5DYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLndlPWFbY10pfXJldHVybiB0aGlzLndlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueGUpcmV0dXJuIHRoaXMueGU7dmFyIGE9IiI7KGE9dGhpcy53cSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMueGU9YX0sSHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLk1sfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUG49dGhpcy5hWzZdO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuYXI9dGhpcy5hWzVdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5maj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUG46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkpwOnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hcjp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLmZqfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Obig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsCk1hOiJYTUxfUEFSU0VfRVJST1IifSx6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTWE6IkRVUkFUSU9OX0VSUk9SIn0sTmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE1hOiJFTVBUWV9WQVNUIn0sR2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTWE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LERmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsCm1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixNYToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixNYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEZ3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLApNYToiTUVESUFGSUxFX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTWE6IkRVTU1ZX0FEIn19LEY9e0VmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTWE6Ik5PX0FEUyJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixNYToiTk9fTUVESUFGSUxFUyJ9LEd3Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE1hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTWE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19CmMuVmo9YjtiLnByb3RvdHlwZT17bnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Wanx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMubnMoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5lZD1iO3RoaXMuTmE9W107dGhpcy5vcmlnaW49bnVsbH1jLmtqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5ranx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3E9dGhpcy5hWzVdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMuZmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19CmMudnA9YjtiLnByb3RvdHlwZT17anE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54aTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLnZwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5qcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuQWg9YTt0aGlzLnZpZGVvPWI7dGhpcy5MZD1bXTt0aGlzLnhoPVtdO3RoaXMuTWU9W107dGhpcy5Ndj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLlBrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuQWgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5BaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBnPWUuY29udGVudFdpbmRvdztnLml4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlZ0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLk90LmJpbmQodGhpcyl9O3ZhciBrPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwprLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztnLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7Zy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspO3RoaXMuTGQucHVzaCh7c3JjOmMsZnJhbWU6ZSxtdDpmLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5NZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLk1lW2JdO2MudHlwZT09PWEmJmMueW8odGhpcy5xcShhKSl9fSxxcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntyeDohMCxxeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntleDoidmlkZW8iLHR4OiJqc0N1c3RvbSIsdXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsdng6MSxQdzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEdxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5MZC5sZW5ndGg7YisrKWlmKHRoaXMuTGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5MZFtiXS5tdDtyZXR1cm4iIn0sVnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLkdxKGIpLHZlbmRvcjpifSk7CnRoaXMuRHUoKX0sT3Q6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk12Lm1hcChmdW5jdGlvbihhKXt0aGlzLllmKGEsYil9LmJpbmQodGhpcykpOnRoaXMuWWYoYSxiKX0sWWY6ZnVuY3Rpb24oYSxiKXt0aGlzLk1lLnB1c2goe3R5cGU6YSx5bzpiLG94OiExfSl9LER1OmZ1bmN0aW9uKCl7dGhpcy54aC5tYXAoZnVuY3Rpb24oYSl7YS5Hcnx8KGEuaHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Hcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUGE9Yy5Qa3x8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXM9dGhpcy5hWzNdO3RoaXMudnY9dGhpcy5hWzEwXTt0aGlzLiRvPQp0aGlzLmFbOV07dGhpcy5xbj10aGlzLmFbMV07dGhpcy5Xbj10aGlzLmFbM107dGhpcy5Ibj10aGlzLmFbMV07dGhpcy5hbD10aGlzLmFbOV07dGhpcy5rcD10aGlzLmFbOF07dGhpcy5qdD10aGlzLmFbNV07dGhpcy5Qaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs2XX1jLktrPWI7Yi5wcm90b3R5cGU9e2xzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tczp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnY6dGhpcy5abyhhKX0sWm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRvOnRoaXMucG4oYSl9LHBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xbjp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV246dGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhuOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hbDp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmtwOnRoaXMuaXQoYSl9LGl0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qdDp0aGlzLk9qKGEpfSxPajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLktrfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5scyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmliPWEuQmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5SYj1bXX1jLlZpPWI7Yi5wcm90b3R5cGU9e2dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuZ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6Cihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxJdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFloOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSwKcWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5hZCx0aGlzLmYucygpKX0sWXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5iZCx0aGlzLmYucygpKSl9LGRmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmliLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5JYyYmdGhpcy5mLkljKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPQpiLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWnAodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy52ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSWMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsKInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5SYi5sZW5ndGg7YSsrKXRoaXMuUmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5KaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLldiLmJpbmQodGhpcyksMTApfSxYZjpmdW5jdGlvbihhKXt0aGlzLlJifHwodGhpcy5SYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuUmIucHVzaChhKX0sdmU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5WaXx8WmEsQz1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzddO3RoaXMuRWs9dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzhdO3RoaXMuWWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5Jbj1iO2IucHJvdG90eXBlPXtndjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5odjp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3M6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVrOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGw6dGhpcy5YaShhKX0sWGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgYWI9Yy5Jbnx8YWIsS2M9bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZ3YoNCk7KGZ1bmN0aW9uKGMpe2MuQWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5CZChiKTt0aGlzLm1nKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx5ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYmI9Yy5BbHx8YmI7KGZ1bmN0aW9uKGMpe2Muemw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuUWI9dGhpcy5RYnx8ITE7dGhpcy5QZj10aGlzLlJmPXRoaXMuUmc9dGhpcy5lYT10aGlzLm9mPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuVnAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm9mPSEwO3RoaXMuUmcmJnRoaXMuZ2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuWWMoKTsKdGhpcy5SZz0hMDt0aGlzLmdnKCl9LmJpbmQodGhpcykpO3RoaXMuY2coKX0sZ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5ZYygpO2lmKCF0aGlzLm9mJiYhdGhpcy5ZYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMub2YmJnRoaXMuUGYmJiF0aGlzLlJmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0sWWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApjZzpmdW5jdGlvbigpe2lmKHRoaXMuWWMoKSl7dmFyIGI9dGhpcy5HZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuUGY9Yi5Nd310aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN4KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSx6cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxWcDpmdW5jdGlvbihiLGEpe3RoaXMuUWI9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRjKCl9LmJpbmQodGhpcyksMTAwKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi55ZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLnpxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuemx8fGNiOyhmdW5jdGlvbihjKXtjLkJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkhyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlNsLiRtLlltP3dpbmRvdy5PTy5TbC4kbS5ZbS5LdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnNlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBiYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgY2IoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuVms9dGhpcy5hWzZdO3RoaXMuZXM9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzNdO3RoaXMudHQ9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMua209YjtiLnByb3RvdHlwZT17VWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZrOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lczp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXA6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmI9Yy5rbXx8ZmIsTGM9bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuVWsoNCk7KGZ1bmN0aW9uKGMpe2MuSGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5KZygpfSxKZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVihiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy50aCgpfSx0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuSGl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOwoxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy50YSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnRhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmRnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBoYj1jLkdpfHxoYjsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LHdoOmZ1bmN0aW9uKGIpe2I9bmV3IGdiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaGIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XcHx8KHRoaXMuV3A9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLndoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBpYj1jLklpfHxpYixUPW5ldyBpYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs4XX1jLnZ3PWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYj1jLnZ3fHxqYixNYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5mcig0KTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxJYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuZG18fFU7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuU2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlNjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTXMoYSl9LmJpbmQodGhpcykpO3kuU2MoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5TYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuTnEoKX0sTXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLmNtfHxWOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy50ZCYmKGI9ZS5mcChiLHRoaXMudGQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnRkfHwodGhpcy50ZD1bXSksdGhpcy50ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sU2M6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFZ1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuRmN8fCh0aGlzLkZjPVtdKSx0aGlzLkZjLnB1c2goYiksdGhpcy5YdCgpJiYodGhpcy5YZSgpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxOcTpmdW5jdGlvbigpe2lmKHRoaXMuRmMpZm9yKHZhciBiPTA7Yjx0aGlzLkZjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuRmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5WdShiKX19KX0pKGMpO3ZhciBrYj1jLmVtfHxrYix5PW5ldyBrYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlxPXRoaXMuYVsxMF07dGhpcy5Ncj10aGlzLmFbNF07dGhpcy5ibT10aGlzLmFbMl07dGhpcy55cD10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbM107dGhpcy5Cbj10aGlzLmFbMTBdO3RoaXMuJG49CnRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzJdfWMudm89YjtiLnByb3RvdHlwZT17aHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYm06dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlwOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zczp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm46dGhpcy5abihhKX0sWm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy4kbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYj1jLnZvfHxsYixOYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaHEoNCk7KGZ1bmN0aW9uKGMpe2MuRGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxKYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLkRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5FaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5FaXx8bmI7KGZ1bmN0aW9uKGMpe2MuRmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgbWIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgbmIoZSx0aGlzLkkpKS5nKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5GaXx8b2IscGI9bmV3IG9iKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJsPXRoaXMuYVszXTt0aGlzLm1yPXRoaXMuYVsyXTt0aGlzLnhqPXRoaXMuYVsxXTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs5XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLkZzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLnd2PWI7Yi5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuUmw6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1yOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXE6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkpzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWI9Yy53dnx8cWIsT2M9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUWwoNCk7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5WKGIpO3RoaXMuWihhKTt0aGlzLk50KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMub2x8fHJiOyhmdW5jdGlvbihjKXtjLm5sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpO3RoaXMuZ2k9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZ2kmJih0aGlzLkcoKSx0aGlzLmdpPSEwLHRoaXMucmEoKSk7YS5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgc2I9Yy5ubHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyByYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBzYihjLAp0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHRiPWMucGx8fHRiLFc9bmV3IHRiKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmh3PXRoaXMuYVsyXTt0aGlzLlB2PXRoaXMuYVs0XTt0aGlzLnhyPXRoaXMuYVs0XTt0aGlzLm1qPXRoaXMuYVs5XTt0aGlzLlByPXRoaXMuYVsxXTt0aGlzLmZ1PXRoaXMuYVs2XTt0aGlzLlJrPXRoaXMuYVs3XTt0aGlzLlNwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuWnU9YjtiLnByb3RvdHlwZT17Z3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh3OnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qdjp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHI6dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1qOgp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ1OnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sazp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB1Yj1jLlp1fHx1YixQYz1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5ndyg0KTsoZnVuY3Rpb24oYyl7Yy5KbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxMYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy5KbXx8dmI7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEx0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9W10pO3RoaXMuYWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnRhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnlhP3RoaXMuTHQodGhpcy55YSk6KHRoaXMueWE9dGhpcy5WYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnlhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMucmMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuYWImJnRoaXMuYWIubGVuZ3RoJiYxPHRoaXMuYWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5hYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuYWJbYV0mJjMwMyE9dGhpcy5hYlthXSYmNDAzIT10aGlzLmFiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy50YSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5JbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB2YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHdiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB4Yj1jLkttfHwKeGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVs1XTt0aGlzLnZuPXRoaXMuYVs3XTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnV3PXRoaXMuYVsxXTt0aGlzLlJuPXRoaXMuYVs1XTt0aGlzLkl0PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuQ209YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFwOnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYXQ6dGhpcy50dyhhKX0sdHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51dzp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm46dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkl0Ogp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHpiPWMuQ218fHpiLFFjPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLlBwKDQpOyhmdW5jdGlvbihjKXtjLlhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlJlPSExfSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy54dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHh0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlJlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlJlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEV1OmZ1bmN0aW9uKCl7dGhpcy5SZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuWGx8fEFiOyhmdW5jdGlvbihjKXtjLldsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5pYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ocz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5ocz8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuV2x8fEJiOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBCYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIENiPWMuWWx8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdj10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNF07dGhpcy5Mcz10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbN107dGhpcy5Daz10aGlzLmFbM107dGhpcy5icD10aGlzLmFbMV07dGhpcy5udj10aGlzLmFbMl07dGhpcy5Zbz10aGlzLmFbN107dGhpcy5Scj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLmptPWI7Yi5wcm90b3R5cGU9CntrdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubHY6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVyOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mczp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNrOnRoaXMuYXAoYSl9LGFwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5icDp0aGlzLm12KGEpfSxtdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnY6dGhpcy5YbyhhKX0sWG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllvOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBFYj1jLmptfHxFYixSYz1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5VbHx8RmI7KGZ1bmN0aW9uKGMpe2MuVGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5TbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmtkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5XcigpOnRoaXMuZmcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxTbzpmdW5jdGlvbigpe3RoaXMuTmYoKXx8dGhpcy5tKCEwKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtkKCk7IWIubmEmJmIuWCYmYi5KdyYmYi5MdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMua2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sa2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5vaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMub2g9YltjXSk7cmV0dXJuIHRoaXMub2h9LApkeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5rZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBGYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEdiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEhiPWMuVmx8fEhiLEliPW5ldyBIYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdj10aGlzLmFbM107dGhpcy5taz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxMF19Yy5XaT1iO2IucHJvdG90eXBlPXtwdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXY6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgSmI9Yy5XaXx8SmIsU2M9bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ClNjLnB2KDQpOyhmdW5jdGlvbihjKXtjLklrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sYng6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxKYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPQpjLklrfHxYOyhmdW5jdGlvbihjKXtjLkhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlNlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuU2U9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5TZSYmYiE9dGhpcy5TZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLnphKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS5qeCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmCih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhrfHxZOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5YZSgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxLYj1jLkprfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV0PXRoaXMuYVs2XTt0aGlzLlJqPXRoaXMuYVs2XTt0aGlzLmNqPXRoaXMuYVs2XTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbMl07dGhpcy5xcj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5mcz1iO2IucHJvdG90eXBlPXtEdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXQ6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Sajp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY2o6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmp2OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Uazp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTW46dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTWI9Yy5mc3x8TWIsVGM9bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuRHQoNCk7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGd4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuemp8fE5iOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5PbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIE9iPWMueWp8fE9iOyhmdW5jdGlvbihjKXtjLkFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE5iKGJbYV0pO2MubWF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IE9iKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTsKdmFyIFBiPWMuQWp8fFBiLFFiPW5ldyBQYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ZcD10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbN107dGhpcy5UbT10aGlzLmFbNF07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Ddz10aGlzLmFbNV07dGhpcy5TcT10aGlzLmFbMl07dGhpcy5Vcz10aGlzLmFbMTBdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtYcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlFzOnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5UbTp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmk6dGhpcy5CdyhhKX0sQnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/CnRoaXMuQ3c6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNxOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Vczp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmI9Yy5zanx8UmIsVWM9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuWHAoNCk7KGZ1bmN0aW9uKGMpe2MuUW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT0KYS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlYoYSl9ZWxzZSB0aGlzLmNhKCl9LE10OmZ1bmN0aW9uKCl7dGhpcy5PZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuT2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk9kfHwodGhpcy5PZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LApKYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFNiPWMuUW18fFNiOyhmdW5jdGlvbihjKXtjLlBtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFF0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMudmMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy52YyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLnZjKGEpfS5iaW5kKHRoaXMpKX0sdmM6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LEpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy52Yyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5RdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLkpmKCk7dGhpcy5QdCgpfSxQdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsZnVuY3Rpb24oYil7dGhpcy52YyhiKX0uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuS3Q9ITB9fSl9KShjKTt2YXIgVGI9Yy5QbXx8VGI7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFRiKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFViPWMuUm18fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3Y9dGhpcy5hWzVdO3RoaXMua3I9dGhpcy5hWzldO3RoaXMuRm49dGhpcy5hWzhdO3RoaXMua2s9CnRoaXMuYVs4XTt0aGlzLkJpPXRoaXMuYVs2XTt0aGlzLlh1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVs3XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmZxPWI7Yi5wcm90b3R5cGU9e3J2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zdjp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3I6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZuOnRoaXMuamsoYSl9LGprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5razp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQmk6dGhpcy5XdShhKX0sV3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlh1OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdDp0aGlzLk1tKGEpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5mcXx8V2IsVmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMucnYoNCk7KGZ1bmN0aW9uKGMpe2MudW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5yaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LApQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucmgmJih0aGlzLnJoPSEwLHRoaXMuVyYmdGhpcy5XKCkpfX0pfSkoYyk7dmFyIE89Yy51bXx8TzsoZnVuY3Rpb24oYyl7Yy50bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy5DYnx8KHRoaXMuQ2I9MCksdGhpcy5DYisrLDE1PHRoaXMuQ2Ipe2lmKHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnlhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnRtfHxQOyhmdW5jdGlvbihjKXtjLnZtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLlRhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj0KbmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuWGUoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBYYj1jLnZtfHwKWGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV3PXRoaXMuYVsxMF07dGhpcy54bz10aGlzLmFbM107dGhpcy5VaT10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbM107dGhpcy5sbD10aGlzLmFbMV07dGhpcy51cj10aGlzLmFbOV07dGhpcy5MbD10aGlzLmFbNl07dGhpcy56bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLll1PWI7Yi5wcm90b3R5cGU9e0R3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG86dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zcDp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGw6dGhpcy50cihhKX0sCnRyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy55bShhKX0seW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgWmI9Yy5ZdXx8WmIsV2M9bmV3IFpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9V2MuRHcoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSk7YSYmdGhpcy5WKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5xa3x8WjsoZnVuY3Rpb24oYyl7Yy5waz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkRjPXRoaXMueWE9dGhpcy5VYz0hMTt0aGlzLnZoPWUuR2IoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9CmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuT2crKztpZigxMDx0aGlzLk9nKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fAotMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTsKYnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy50YSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLnBrfHxhYTsoZnVuY3Rpb24oYyl7Yy5yaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9CjA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciAkYj1jLnJrfHwkYixhYz1uZXcgJGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzFdO3RoaXMudms9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdO3RoaXMuZ3Q9dGhpcy5hWzJdO3RoaXMuR3A9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMl19Yy53cD1iO2IucHJvdG90eXBlPQp7cG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFvOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52azp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHM6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmd0OnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJjPWMud3B8fGJjLFhjPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLnBvKDQpOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLAphPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLnVqfHxjYzsoZnVuY3Rpb24oYyl7Yy50aj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMudGp8fApkYzsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubWEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBkYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGVjPWMudmp8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbD10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbMl07dGhpcy5ibz10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbNV07CnRoaXMuQm09dGhpcy5hWzNdO3RoaXMueG49dGhpcy5hWzRdO3RoaXMuTWs9dGhpcy5hWzhdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMucXA9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5Vaj1iO2IucHJvdG90eXBlPXtHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5JcShhKX0sSXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpxOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm86dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG46dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1rOnRoaXMuTWooYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Oajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLnFwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgZ2M9Yy5Vanx8Z2MsWWM9bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuR2woNCk7KGZ1bmN0aW9uKGMpe2Muamk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5WKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBoYz1jLmppfHxoYzsoZnVuY3Rpb24oYyl7Yy5paT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLAoxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgaWM9Yy5paXx8aWM7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxZYTpmdW5jdGlvbihiKXtiPW5ldyBoYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGljKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLllhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5ZYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYz1jLmtpfHxqYyxrYz1uZXcgamMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ1PXRoaXMuYVsyXTt0aGlzLnJsPXRoaXMuYVs4XTt0aGlzLlpqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMucnc9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5idTp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucmw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgbGM9Yy5yd3x8bGMsWmM9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuYXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9CnRoaXMuYWg9dGhpcy4kZz0hMTt0aGlzLndkPVtdO3RoaXMuV2U9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBZYj9udWxsOlliLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuT2w9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5BcShhKTpbXSxiO3RoaXMuYWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuJGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuQ2goYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLlpnKWJyZWFrOwpiPXRoaXMuV2VbY107dGhpcy5yZihiKSYmKHRoaXMud2QucHVzaChiKSx0aGlzLkNoKGIpKX19LHJmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5yZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxDaDpmdW5jdGlvbihhKXt0aGlzLnJmKGEpJiZhLmcoKX0sR3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHQmJiF0aGlzLiRnKWZvcih0aGlzLlpnPSEwLGE9MDthPHRoaXMud2QubGVuZ3RoO2ErKyl0aGlzLndkW2FdLktiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2RbYV0uS2IpfX19KShjKTt2YXIgbWM9Yy5PbHx8bWMsTT1uZXcgbWM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLlhqPXRoaXMuYVsxMF07dGhpcy5Pcz10aGlzLmFbNl07dGhpcy5HdD10aGlzLmFbMV07dGhpcy52dD10aGlzLmFbNV07dGhpcy5jcT10aGlzLmFbMTBdO3RoaXMuQ3A9dGhpcy5hWzEwXTt0aGlzLlhxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuWnM9YjtiLnByb3RvdHlwZT17S286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxvOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yajp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3M6dGhpcy5GdChhKX0sRnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HdDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNxOnRoaXMuQnAoYSl9LEJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ3A6dGhpcy5XcShhKX0sCldxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYz1jLlpzfHxuYywkYz1uZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5Lbyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueWMoay5DdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueWMoay5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBhZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHFjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS55cigpLHtpZDpiZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuTm89dGhpcy5hWzZdO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsxXTt0aGlzLm90PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVs2XTt0aGlzLkRzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTG09YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhtOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMud3M6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmRrOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTm86dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5obDp0aGlzLktqKGEpfSxLajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGo6dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm90OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Hazp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWGs6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5MbXx8b2MsY2Q9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLldtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zaD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMucmQ9MDt0aGlzLiRhPSIiO3RoaXMueGQ9W107dGhpcy55ZD0wO3RoaXMudWg9ITE7dGhpcy5UZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5saT1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLnNoPWF9LGJmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxpdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy4kYV1bYV0pOwpyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oYSxiKXtlLnphKCJ3ZWx0LmRlIikmJmUuWmEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy56cigpKXRoaXMubGIubCh0aGlzLmxiLm1kLHRoaXMubGIuRGEsdGhpcy5sYi5WZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLnhjKTtlbHNlIGlmKHRoaXMuUHEoKSl0aGlzLmN1KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmUudihrLmFkLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5JdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFFhKGwsdGhpcy5sYixnKTtsLmh1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5ncyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuRWgobCl9fSx6cjpmdW5jdGlvbigpe3ZhciBhPQpuZXcgRGF0ZSxiPTA7aWYodGhpcy5yZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnJkLmdldFRpbWUoKSx0aGlzLnJkPWEsM0U1PGI/ITA6ITE7dGhpcy5yZD1hO3JldHVybiExfSx6dTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmFmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5GYSgiYWRUYWciKTt0aGlzLkZhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5GYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMucmcoYSkpP3RoaXMuSmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX0seXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuYWYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLm91KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5yZyhjKSk/dGhpcy5KYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX19LHJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxUdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnN1KHRoaXMueXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTGEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuYWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuSmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuYmQsdGhpcy5wbGF5ZXIucygpKSl9fSxTdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm51KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSWUoKX0sZzpmdW5jdGlvbigpe3RoaXMuenUoKTt0aGlzLnBsYXllci5JZSYmdGhpcy5TdCgpO3RoaXMuVHQoKX0sVXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy54ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMud3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLAphW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy55ZD10aGlzLnhkLmxlbmd0aH0sUHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMueWQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy51aD1hO2ZvcihhPTA7YTx0aGlzLnhkLmxlbmd0aDthKyspdGhpcy54ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkJ0LmJpbmQodGhpcykpfSxCdDpmdW5jdGlvbihhKXt0aGlzLnlkLS07YSYmdGhpcy5UZS5wdXNoKGEpOzA+PXRoaXMueWQmJnRoaXMudWgoKX0sZ3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVGUubGVuZ3RoO2MrKyliPXRoaXMuVGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMubGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm9pPXRoaXMuYVs2XTt0aGlzLlZyPXRoaXMuYVsxMF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubnc9dGhpcy5hWzVdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMua3c9dGhpcy5hWzFdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMub209dGhpcy5hWzFdO3RoaXMudXM9dGhpcy5hWzhdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5ycz1iO2IucHJvdG90eXBlPXtuaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2k6dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZyOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qajp0aGlzLmx3KGEpfSxsdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnc6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF2OnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5rdzp0aGlzLnh3KGEpfSx4dzpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnl3OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vbTp0aGlzLnRzKGEpfSx0czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXM6dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5yc3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQubmkoNCl9KS5jYWxsKGNlaVF1YWVmaGFpQnV4YWUsY2VpUXVhZWZoYWlCdXhhZSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.244.75
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.75.244.243.136.clients.your-server.de
- Software
-
AmazonS3 /
- Resource Hash
- 5ee5cb1d210bab87efd0825369e6bcbbdf3f9fcc0d1fbf227b0bc670e8a8d3dd
|
GET
H/1.1
|
200
OK
|
4766719655
Show response
api.yieldlove-ad-serving.net/v1/bl/4444/
|
47 B
297 B
|
96ms
34ms
|
XHR
application/json |
18.196.191.159
Amazon.com
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
34ms
34ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/gwzmEZMBA/k0FPImvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B03A21A54Az1A51AmjEpkF9xAz4Ay0AxzA5zA25A5mAzpF6lF9zAwwA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B03A21A54Az1A51AmhEwkF90A32A15A4zA15A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A03A44AxwA51AymEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B03A22A3xA52A11AmjEpkF9xAz4Ay0AxyA01A4zAxmAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B03A22A3xA52A11AmhEwkF90A32A23Ax5A21A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A03A44AxxAz3AyBELlnFCUkzFnBPyDAAAAAAAB7JvAPDAAFAA7JvTl5/APAAAJPAWEABl5/AZCAAOA55A55A85B55A58E55A55AGAx5AzxA03Arl5/AP2AAJPAWEAHl5/ASksFhFjAAAAAAAAAAAAEAAA7JvAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA0xAy0A14AzxAGAkpFylFj0FAAAAKA01Az5AzwA22A20AKA03A22A3xA52A11AJAylFj0FhuFnsFlBFKA03A22A3xA52A11AKA03A22A3xA52A11AzAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAl5/AAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFdfWHWA
- Requested by
- Host: www.giga.de
URL: https://www.giga.de/webapps/paypal/tipps/paypal-login-so-gehts-und-so-loest-ihr-login-probleme/
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
H/1.1
|
200
OK
|
config.json
Show response
gocp.stroeermediabrands.de/absconf/www.giga.de/
|
11 KB
11 KB
|
135ms
42ms
|
Fetch
application/json |
188.40.16.106
HETZNER-AS
|
|
|
GET
H2
|
200
|
content14_10_18m.js
Show response
vidstat.taboola.com/
|
37 KB
8 KB
|
30ms
30ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
oppsula.js
Show response
vidstat.taboola.com/oppsula/1.3.6/
|
15 KB
5 KB
|
30ms
29ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
OvaMediaPlayer.js
Show response
vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/
|
676 KB
180 KB
|
29ms
28ms
|
Script
application/javascript |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/OvaMediaPlayer.js
- 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.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- e3cd4f1f8c496707beb1dd7a37c361bdf81deea0108a3ac762a88038c2a0982a
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
77 B
|
38ms
36ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7wG0CFgOW6IPyNq4Z0gSW6IPyNq4Z0gUAAAAGBvQHHMQi7iYjFm-x2CwWq8lkt1gMZqvRajWajIawQSzibjJi8RaLzWKxmkx2g8VusZjNRqPRFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAKDkSwu05vSwnh9sfAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiEWMAAAAALJMwHqPJnVCZVEFAECQbgVwBQAQ0Mamk-EfBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhKIGw9KAOPvp1X4BAQDWfgEBANjUDQDgLQAu6AxwuVruFqsziMlmtJvMDgAAAODu____Xw-kLJ7FbuKxuWyTkW2wmDlspsVu5RxMHK6FceGwbU8N4ZhsRTo2t29EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhGGTBOHb2NZrDW23WYtWlg2buFosFrrhruFc2NyODYe41r0-phOw9XI5VhuUTCgai-Ci3SiOV3-LpflrXlb3Dqnz2ERSzQni3Qiu-xbFs9iN_HYXLbJyDZYzBw202K3cg4mDtfCuHDY9iXTxOHbWBZrjW23WYsWlo1bOBqs1rrhbuHcmByOjce4Fr0-ptNwNXI5lvvGarYc7YbDwXLfWM2Wo91wOFjuO3SG7-pzNipvWoXHZRxveyKvzGlQuAwW7-9okcZuvZlRZRtbLKaFejw9-v1-v9_v9_v9fr9B6zmYDQZFLBGcLtKJ6GU8XcQSydMinQhnu8Fy5nKNlpvdbLKxWIyTwXK4cI4Go9VqMJpNxBKl6SKd6HUvi8Nw-PwFD-fhYfaLnobD5y94OA8Ps1vs9zntbs3frXMZTZ-36m5ya_5usd_lOb2VRstb7Pc57W7B5W8xu9wui_qPDLica4Zz5WyuGC5XCQAAAAAAAABgCXPmTQAAAABOA1ksBpPFcgEgxFh3CT6lQh6dwN-KGz-GmNPl73JZ3pq3xa1z-hxWBpDYKQA!&cmcv=&pix=31589837&cb=1569478814625&uv=23141&tms=1569478814625&abt=aat1_vA!be5_vB!des_vB!expl_vC!pl50200-527_vB!ufm_vA&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1569478809062.6692!ts:1569478814625&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
52 B
|
38ms
36ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7wG0CFgOW6IPyNq4Z0gSW6IPyNq4Z0gUAAAAGBvQHHMQi7iYjFm-x2CwWq8lkt1gMZqvRajWajIawQSzibjJi8RaLzWKxmkx2g8VusZjNRqPRFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAKDkSwu05vSwnh9sfAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiEWMAAAAALJMwHqPJnVCZVEFAECQbgVwBQAQ0Mamk-EfBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhKIGw9KAOPvp1X4BAQDWfgEBANjUDQDgLQAu6AxwuVruFqsziMlmtJvMDgAAAODu____Xw-kLJ7FbuKxuWyTkW2wmDlspsVu5RxMHK6FceGwbU8N4ZhsRTo2t29EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhGGTBOHb2NZrDW23WYtWlg2buFosFrrhruFc2NyODYe41r0-phOw9XI5VhuUTCgai-Ci3SiOV3-LpflrXlb3Dqnz2ERSzQni3Qiu-xbFs9iN_HYXLbJyDZYzBw202K3cg4mDtfCuHDY9iXTxOHbWBZrjW23WYsWlo1bOBqs1rrhbuHcmByOjce4Fr0-ptNwNXI5lvvGarYc7YbDwXLfWM2Wo91wOFjuO3SG7-pzNipvWoXHZRxveyKvzGlQuAwW7-9okcZuvZlRZRtbLKaFejw9-v1-v9_v9_v9fr9B6zmYDQZFLBGcLtKJ6GU8XcQSydMinQhnu8Fy5nKNlpvdbLKxWIyTwXK4cI4Go9VqMJpNxBKl6SKd6HUvi8Nw-PwFD-fhYfaLnobD5y94OA8Ps1vs9zntbs3frXMZTZ-36m5ya_5usd_lOb2VRstb7Pc57W7B5W8xu9wui_qPDLica4Zz5WyuGC5XCQAAAAAAAABgCXPmTQAAAABOA1ksBpPFcgEgxFh3CT6lQh6dwN-KGz-GmNPl73JZ3pq3xa1z-hxWBpDYKQA!&cmcv=&pix=&cb=1569478814649&uv=23141&tms=1569478814649&abt=aat1_vA!be5_vB!des_vB!expl_vC!pl50200-527_vB!ufm_vA&ft=0&unm=FEED_MANAGER
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
paypal-login-deutsch-rcm960x0.jpg
static.giga.de/wp-content/uploads/2015/07/
|
18 KB
19 KB
|
50ms
50ms
|
Image
image/jpeg |
178.19.70.100
HGCOMP-ASN
|
|
|
GET
H2
|
200
|
/
cx.atdmt.com/
Redirect Chain
-
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
-
https://cx.atdmt.com/?c=11326127829625767291&f=AYwqq4WZ4kNmFD9yuNfm9qQG5iIdaBKxAENwIjgvd3N5WycS-hcGLj_UlPCneX-kvUAde5AHbxUn6pOG0igEWbwS&id=1773162896260346&l=3&v=0
|
42 B
408 B
|
51ms
39ms
|
Image
image/gif |
2a03:2880:f02d:5:face:b00c:0:8c
Facebook
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
33ms
32ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
General
- Full URL
- https://lb35.s400.meetrics.net/data?/gwzmFqOBA/k0FSMmvFytFh0FjvFklF9IEhsFmwFhnFlBFkmBhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B03A21A54Az1A51AmjEpkF9xAz4Ay0AxzA5zA25A5mAzpF6lF9zAwwA42BwwAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BzrF5mBhwFj9B03A21A54Az1A51AmhEwkF90A32A15A4zA15A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEzrF5mBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A03A44AxwA51AymEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29B01Az5AzwA22A20AmjEwpFk9BklFzrF0vFwmBhwFh9B03A22A3xA52A11AmjEpkF9xAz4Ay0AxyA01A4zAxmAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9zEvmF03FhyFlmBhwFi9BylFj0FhuFnsFlmBhwFj9B03A22A3xA52A11AmhEwkF90A32A23Ax5A21A1mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A25A03A44AxxAz3AymEvyFthF0jFvkFl9BT1FwlFyCFhuFulFymBhkF29By5A53A21Az1AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA14A10Ay5A1yAmjEpkF9xAz4Ay3A03A01A2zA4mAzpF6lF93Ay4A45BwmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BzvFm0F3hFylFmhEwiF9iEhuFulFymBhwFj9B1xA14A10Ay5A1yAmhEwkF91Ax1A41A0yA51AymAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA12A50A34A4xA01AxyALlnFDLl1FDLkqFKUkzFnBPGwAAAAAAABpiHAPAAAFAApiHTbosAPBAAtGA5BABbosAZAAAOA55A55A85B55A58E55A55AFAzwA44A5BErbosAPPCAAZAwSAcAAAASksFJFjAAAAAAAAAAAAEAAApiHAAAAAAAHAklFzrF0vFwBFIAzvFm0F3hFylFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA30A30A12Az4AGAkpFylFj0FAAAAIAy5A53A21Az1AKA1xA14A10Ay5A1yAGAihFuuFlyFKA1xA14A10Ay5A1yAKA1xA14A10Ay5A1yAwAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGzFvmF03FhyFlfFhyF0pFrlFslByGEihFuuFlyFdtGA5BAYLAaBAFAAAbosAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjF1VT2YA
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
136.243.5.14
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- h233.meetrics.de
- Software
-
nginx /
- Resource Hash
- 548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
|
GET
BLOB
|
206
Partial Content
|
0f352b50-957c-4ee6-8c29-b2c69e79cb4a
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
BLOB
|
206
Partial Content
|
30eafd56-4c75-468a-949d-dc31eeaec58f
https://www.giga.de/
|
1 KB
0
|
|
Media
video/mp4 |
|
|
|
GET
H/1.1
|
200
OK
|
map.js
Show response
js.adscale.de/
|
21 KB
6 KB
|
27ms
27ms
|
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
|
1093ms
22ms
|
Script
application/javascript |
89.163.159.109
MYLOC-AS
|
|
|
GET
H/1.1
|
200
OK
|
ibb_map.js
Show response
bbcdn-bbnaut.ibillboard.com/library/
|
1 KB
1014 B
|
1198ms
46ms
|
Script
application/javascript |
62.168.44.119
GTSCE GTS Central...
|
|
|
GET
H2
|
200
|
default.js
Show response
ups.xplosion.de/loader/69511/
|
2 KB
2 KB
|
1122ms
35ms
|
Script
text/javascript |
54.77.22.22
Amazon.com
|
|
|
GET
H2
|
200
|
learn
de-gmtdmp.mookie1.com/t/v2/
|
43 B
496 B
|
63ms
24ms
|
Image
image/gif |
35.186.238.175
Google LLC
|
|
|
GET
H/1.1
|
200
OK
|
data
lb35.s400.meetrics.net/
|
43 B
308 B
|
34ms
32ms
|
Image
image/gif |
136.243.5.14
HETZNER-AS
|
|
|
GET
H2
|
200
|
activeview
pagead2.googlesyndication.com/pcs/
Frame 96D5
|
42 B
110 B
|
14ms
14ms
|
Image
image/gif |
2a00:1450:4001:809::2002
Google LLC
|
|
General
- Full URL
- https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstEMn8wa_4wT3BjgYsisvLuXeGGirZEAuqxYNKKRfQaHwfCF3Y1rwiq1BT2QMtAF1DqtXwnFQzMZyAIunz9psqci2yxq8NGDc4wUNMGBUk&sig=Cg0ArKJSzIkCNttU2rqsEAE&adk=1797203554&tt=-1&bs=1585%2C1185&mtos=1083,1083,1083,1083,1083&tos=1083,0,0,0,0&p=121,429,211,1157&mcvt=1083&rs=3&ht=0&tfs=3988&tls=5071&mc=1<e=1&bas=0&bac=0&met=no&avms=nio&niot_obs=1370&niot_cbk=1377&md=2&lm=2&rst=1569478810961&rpt=2618&isd=0&msd=0&oseid=3&xdi=0&uup=1&ps=1618%2C5992&ss=1600%2C1200&pt=-1&bin=1&deb=1-2-7-90-49-14-305-47-0-0-0&tvt=5063&r=v&id=osdim&vs=4&za&uc=19&upc=11&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20190923
- Protocol
- H2
- Security
- TLS 1.3,
, AES_128_GCM
- Server
-
2a00:1450:4001:809::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
|
t.png
gocp.stroeermediabrands.de/
|
98 B
355 B
|
30ms
30ms
|
Image
image/png |
188.40.16.106
HETZNER-AS
|
|
General
- Full URL
- https://gocp.stroeermediabrands.de/t.png?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&url=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%2F&contentPieceId=2857946&publishDate=2016-09-22T12%3A38%3A19%2B02%3A00&_=1569478814676.1980484658
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_256_GCM
- Server
-
188.40.16.106
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.106.16.40.188.clients.your-server.de
- Software
-
/
- Resource Hash
- ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
|
GET
H2
|
200
|
player.css
vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/assets/
|
14 KB
3 KB
|
29ms
28ms
|
Stylesheet
text/css |
151.101.14.2
Fastly
|
|
General
- Full URL
- https://vidstat.taboola.com/vpaid/vPlayer/player/v10.4.4/assets/player.css
- 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.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.14.2
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
AmazonS3 /
- Resource Hash
- 3e519113583c968dd0daa3a70249fc54df7114ba2595bfe1644d2320e6d25aa5
|
GET
H2
|
200
|
dsm.js
Show response
vidstat.taboola.com/vpaid/ds/176/
|
1 KB
747 B
|
28ms
28ms
|
Script
application/octet-stream |
151.101.14.2
Fastly
|
|
|
GET
H2
|
200
|
st
convammp.taboola.com/
|
0
53 B
|
36ms
36ms
|
Image
text/plain |
151.101.114.49
Fastly
|
|
General
- Full URL
- https://convammp.taboola.com/st?cijs=convusmp&ttype=81&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7wG0CFgOW6IPyNq4Z0gSW6IPyNq4Z0gUAAAAGBvQHHMQi7iYjFm-x2CwWq8lkt1gMZqvRajWajIawQSzibjJi8RaLzWKxmkx2g8VusZjNRqPRFEKM5TIZ1AIJy-z3HRSU09NjdhlkLJfJoBbImiaX3w1faDodPte9Xvf73XVOn8Mucvl1L4vDcPj8BQ_n4WH2i56Gw-cveDgPD7Nb7Pc57W7N361zGU2ft-pucmv-brHf5Tm9lUbLW-z3Oe1uweVvMbvcLr8cAAAAAB4AlAr7IX4AAQAiAAAAACQAAAAAKAIq_i0ELgAAAAAwAAqwfjQAKDkSwu05vSwnh9sfAAAPASAAAAMKJAADOE0lABU5BycAAAAAAAAAACz_____MQB6xGcyABlKgz0ADz4AD0QFiEWMAAAAALJMwHqPJnVCZVEFAECQbgVwBQAQ0Mamk-EfBgAAQDC2QA-L32922DV-t8sAAAAAAAAAAMz-z_7RhKIGw9KAOPvp1X4BAQDWfgEBANjUDQDgLQAu6AxwuVruFqsziMlmtJvMDgAAAODu____Xw-kLJ7FbuKxuWyTkW2wmDlspsVu5RxMHK6FceGwbU8N4ZhsRTo2t29EWGa_76CgnJ4es8sgY7lMBrVA1jS5_AbxQcOwnAyC-U3YYrSaTDbL4Wy5mAyGo-FotD-BGw1wgobDwWI3WOwWi-FkMRkNloMFCsRgghMyHG0mq9FutZssh5PRaLaZbJCiVavZaDMYrmaT2W63Gg6Gy9EIKVqzmE0mi9loudsMlpPRYDgZDhGGTBOHb2NZrDW23WYtWlg2buFosFrrhruFc2NyODYe41r0-phOw9XI5VhuUTCgai-Ci3SiOV3-LpflrXlb3Dqnz2ERSzQni3Qiu-xbFs9iN_HYXLbJyDZYzBw202K3cg4mDtfCuHDY9iXTxOHbWBZrjW23WYsWlo1bOBqs1rrhbuHcmByOjce4Fr0-ptNwNXI5lvvGarYc7YbDwXLfWM2Wo91wOFjuO3SG7-pzNipvWoXHZRxveyKvzGlQuAwW7-9okcZuvZlRZRtbLKaFejw9-v1-v9_v9_v9fr9B6zmYDQZFLBGcLtKJ6GU8XcQSydMinQhnu8Fy5nKNlpvdbLKxWIyTwXK4cI4Go9VqMJpNxBKl6SKd6HUvi8Nw-PwFD-fhYfaLnobD5y94OA8Ps1vs9zntbs3frXMZTZ-36m5ya_5usd_lOb2VRstb7Pc57W7B5W8xu9wui_qPDLica4Zz5WyuGC5XCQAAAAAAAABgCXPmTQAAAABOA1ksBpPFcgEgxFh3CT6lQh6dwN-KGz-GmNPl73JZ3pq3xa1z-hxWBpDYKQA!&cmcv=&uv=23141&unm=FEED_MANAGER&cb=1569478814754&abt=aat1_vA!be5_vB!des_vB!expl_vC!pl50200-527_vB!ufm_vA&baseReportD=taboola.com&dataCenter=am&
- Protocol
- H2
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
151.101.114.49
Frankfurt am Main, Germany,
ASN54113
(FASTLY - Fastly, US),
- Reverse DNS
- Software
-
nginx/1.13.12 /
- Resource Hash
- e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
|
GET
H2
|
200
|
p.min.js
Show response
cdn.emetriq.de/adp/profiling/0.2.18/
|
5 KB
2 KB
|
21ms
6ms
|
Script
application/javascript |
2600:9000:20bb:c000:1c:8c89:a300:93a1
Amazon.com
|
|
|
GET
H2
|
200
|
data
Show response
ups.xplosion.de/
|
4 KB
3 KB
|
37ms
37ms
|
Script
text/javascript |
54.77.22.22
Amazon.com
|
|
General
- Full URL
- https://ups.xplosion.de/data?title=PayPal-Login%3A%20so%20geht%27s%20ohne%20Probleme&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fwebapps%2Fpaypal%2Ftipps%2Fpaypal-login-so-gehts-und-so-loest-ihr-login-probleme%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=400ba9b7a2a0cf36b1673cdc2bd84db6&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=826359537246
- 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
-
54.77.22.22
Dublin, Ireland,
ASN16509
(AMAZON-02 - Amazon.com, Inc., US),
- Reverse DNS
- ec2-54-77-22-22.eu-west-1.compute.amazonaws.com
- Software
-
/
- Resource Hash
- 8f0c2e9f2007a2cf9a791004cbf26a7536c5bc1b7bdbc7ca9772eec3f192cd7c
|
GET
H/1.1
|
200
OK
|
adrtxtag.min.js
Show response
cdn.adrtx.net/
|
840 B
848 B
|
148ms
36ms
|
Script
application/javascript |
54.154.35.6
Amazon.com
|
|
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
Frame 63DE
Redirect Chain
-
https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaCES_FEiJ-WSJkEiUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
-
https://uss.xplosion.de/usersync?sid=65966&fpid=4204964015916562370
|
42 B
660 B
|
38ms
37ms
|
Image
image/gif |
54.77.22.22
Amazon.com
|
|
|
GET
H2
|
200
|
segments
Show response
api.theadex.com/v0.9/pub/
|
56 B
126 B
|
87ms
22ms
|
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
H/1.1
|
200
OK
|
activation
adstax-match.adrtx.net/
Frame 28FE
|
0
0
|
140ms
35ms
|
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
H/1.1
|
200
OK
|
hic_qos
Show response
ssl.1.damoh.giga.de/
Frame 4650
|
24 B
409 B
|
129ms
33ms
|
XHR
application/octet-stream |
144.76.9.6
HETZNER-AS
|
|
General
- Full URL
- https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGNlaVF1YWVmaGFpQnV4YWU9Y2VpUXVhZWZoYWlCdXhhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5aYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5zbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5hZCxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlJhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuYmYoYyk7YS5qdShsKTthLml1KG0pO2EuVXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkliLmxlbmd0aCl7dmFyIGE9bC5JYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG49dGhpcy5hWzZdO3RoaXMuTHA9dGhpcy5hWzZdO3RoaXMueG09dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5IcD1iO2IucHJvdG90eXBlPXtDbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG46dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSHB8fGhhLHJjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zbz0hMTt0aGlzLlhiPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQXQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLk5nPXt9O3RoaXMuWmU9ITF9Yy5Gaj1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LEFjOmZ1bmN0aW9uKCl7dGhpcy5aZXx8KHRoaXMuWmU9ZS5hYSgxMCkpO3JldHVybiB0aGlzLlplfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuTmdbYV0mJih0aGlzLk5nW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLAp0aGlzLkh1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnp0KGEuZGF0YSl9LAp6dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LGxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudHEoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmVoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KbmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sa246ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy52YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmVxKGEpKXJldHVybjsoYj10aGlzLmxnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT0KYX19LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxmYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHNlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sQ2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6CiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxKaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxXZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LHplOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCwKZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOwowPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZShhKX0uYmluZCh0aGlzKSwxMDApfSxHYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDwKYTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9CjA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHQucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLQo4XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt4PWs7dT1sO3I9bTtmb3IoZj0wOzE5Pj1mO2YrKylwPWQocSw1KSsobiZ4fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrCmIoZykrYihrKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7CnJldHVybiBifSxGcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5SYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxTYTpmdW5jdGlvbigpe3ZhciBhPXtDaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxacTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSwKQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEFrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxobzpmdW5jdGlvbigpe3JldHVybiBhLkNpKCl8fGEuSmkoKXx8YS5acSgpfHxhLkNsKCl8fGEuT20oKXx8YS5BaygpfHxhLiRsKCl9fTtyZXR1cm4gbnVsbCE9YS5obygpfSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEJjOmZ1bmN0aW9uKGEpe2E9dGhpcy52YShhKS5ob3N0LnNwbGl0KCIuIik7CnZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LENxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudmEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxmcDpmdW5jdGlvbihhLApiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sQ3U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuWGgoYikrIjoiK3RoaXMuWGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxhZjpmdW5jdGlvbihhKXt0aGlzLlhiPQphfSx2ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlhiO3RoaXMuVmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHljOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLllhKGIsZCkpO2ImJihCPWsuWWEoYSxiKSk7ZiYmKEI9ay5ZYShCLGYpKTtxJiYoQj1rLllhKEIscSkpO2MmJihCPWsuWWEoQixjKSk7ZyYmKEI9ay5ZYShCLGMpKTtlLnljKEIpfSxDdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmCjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTtiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DdChhKTtpZihiKWlmKCFsfHwKIWwuWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuemQoKTtsLnhhKGEsITApO2E9bC54YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pOwp0aGlzLk1jW2ZdfHwodGhpcy5NY1tmXT0wKTt0aGlzLk1jW2ZdKys7MTA8dGhpcy5NY1tmXXx8KGY9bC56ZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC54YShmLCEwKSxmPWwueGEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsCihmWzBdP2ZbMF06IiIpKyhmWzFdP2ZbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sR2U6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuRm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxxZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMua2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmxkKGEpOiIifSxsZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSwKYixkLGYpe2Q9ITE7aWYoYi5CZShhKXx8dGhpcy5KcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LlllJiZ3aW5kb3cuc2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7CmQmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLlphKGEsYi5IYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5vZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5rbihlLGEpO3JldHVybiBlfSxaYTpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godGMpe2ModGMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7CmVsc2V7bS54YShhLGUpO2U9bS54YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uSWEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYKMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LCRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLktjKWZvcih2YXIgYyBpbiB0aGlzLktjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuS2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKToKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYSxmLkhhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy4kcihmLm9kKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LYz1hfSx3dzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuWmEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTsKZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0saW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxEcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5Ganx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Faj1iO2IuWWE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnB0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLk1wPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iuc3c9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5MZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuUWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuVWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmNuPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkh2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaGc9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Vbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmJkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuYWQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlNmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5lbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUmM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLldkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLllkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuZG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmRpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuQnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5zZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi5wZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuaWc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmN3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkR2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIuRXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkN2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpO3ZhciBrPWMuRWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnc9dGhpcy5hWzhdO3RoaXMuZW89dGhpcy5hWzNdO3RoaXMudGk9dGhpcy5hWzRdO3RoaXMuVGo9dGhpcy5hWzhdO3RoaXMubW09dGhpcy5hWzldO3RoaXMuY3I9CnRoaXMuYVsyXTt0aGlzLnNyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLnJuPWI7Yi5wcm90b3R5cGU9e2V3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mdzp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZW86dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50aTp0aGlzLlNqKGEpfSxTajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVGo6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1tOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jcjp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLnJufHxqYSx1Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuZXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Haj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHhxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lKwpuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxqZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuamQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5qZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudWUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5qZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sVGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLnhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuamQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuR2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXc9dGhpcy5hWzNdO3RoaXMuQXA9dGhpcy5hWzJdO3RoaXMuYXY9dGhpcy5hWzEwXTt0aGlzLnZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs0XX1jLmR1PWI7Yi5wcm90b3R5cGU9e3p3OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuQXc6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFwOnRoaXMuJHUoYSl9LCR1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmR1fHxrYSx2Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy56dyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuUWk9Yn0pKGMpO3ZhciBMPWMuUWl8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGk9dGhpcy5hWzddO3RoaXMuaGo9dGhpcy5hWzEwXTt0aGlzLnpuPXRoaXMuYVs0XTt0aGlzLnJpPQp0aGlzLmFbOV07dGhpcy5Ucj10aGlzLmFbOV07dGhpcy50bj10aGlzLmFbMTBdO3RoaXMuT2s9dGhpcy5hWzNdO3RoaXMua289dGhpcy5hWzVdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuS249dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy53bD1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTGk6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhqOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bjp0aGlzLnBpKGEpfSxwaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucmk6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRyOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG46dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmtvOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jdDp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLndsfHxsYSx3Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuS2E9e307dGhpcy5JPW51bGw7dGhpcy5IYz0xMDA7dGhpcy5IYj0wO3RoaXMuVGE9MTUwO3RoaXMuS2I9MDt0aGlzLmt1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYT8odGhpcy5IYisrLHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuSGMpKTowPnRoaXMuVGEmJih0aGlzLktiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IYj50aGlzLlRhPyEwOiExfSxYZTpmdW5jdGlvbigpe3RoaXMuSGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGt1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5LYVtiLmphKCldPWI7TSYmTS5haCYmTS5HdShiKX0sV3c6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZSh0aGlzLkthKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9LEVyOmZ1bmN0aW9uKGIpe2I9Yi5HYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkthKWlmKGIuaWQ9PQp0aGlzLkthW2FdLkdhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG54OmZ1bmN0aW9uKGIpe3RoaXMuS2FbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBwPWMuTmx8fHA7KGZ1bmN0aW9uKGMpe2MuUGw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5IYz0xMDt0aGlzLkhiPTA7dGhpcy5UYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLm5nPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuR2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTGE6ZnVuY3Rpb24oKXt9LApzdTpmdW5jdGlvbihiKXt0aGlzLlc9Yn0sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XfSxudTpmdW5jdGlvbihiKXt0aGlzLkplPWJ9LFZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmV9LEllOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYSYmKHRoaXMuSGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkhjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHB4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlFxKCl8fHRoaXMuZm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxKYTpmdW5jdGlvbigpe3JldHVybiExfSxmeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEljOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRWg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSx6aDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sJHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGt4OmZ1bmN0aW9uKCl7dGhpcy5uZ3x8KHRoaXMubmc9ITApfSxwZTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5QbHx8dDsoZnVuY3Rpb24oYyl7Yy5taT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkhmPSIxIjt0aGlzLklmPSIyIjt0aGlzLlptPSIzIjt0aGlzLk9jPTA7dGhpcy5paD0KMzA7dGhpcy5QYj1bXTt0aGlzLmdiPVtdO3RoaXMubWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuV2Y9dGhpcy4kaD0hMTt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5iZihiKTt0aGlzLmx1KGEpfSxnOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3RoaXMuJGh8fCh0aGlzLiRoPSEwLGUuR2UoKSl9LE5lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5ZYiYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9CmUuQWMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLkFjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT0xfSxCcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldLmluaXRpYXRvciE9ZS5BYygpJiYodGhpcy5jZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnVhKCkpe3RoaXMudnIoKTtpZighdGhpcy5CcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5jZigpO3JldHVybn10aGlzLmNmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5UaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLAphKXt0aGlzLnVhKCl8fCh0aGlzLlBiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sVGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1lLnVuaXF1ZSh0aGlzLlBiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5tY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm1jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMubWNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLApiLCEwLGEpfX0sWnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSGZ9LGNmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0scXU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlptfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuT2N9LE5mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkhmfSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5JZn0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuT2N9LGJmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sbHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LHZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sY3M6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLm1pfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbN107dGhpcy5KbD10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMTBdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuZXA9YjtiLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zbjp0aGlzLklsKGEpfSxJbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkpsOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tcDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc206dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFxOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7CnZhciBuYT1jLmVwfHxuYSx4Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Ybig0KTsoZnVuY3Rpb24oYyl7Yy5waj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5wanx8b2E7KGZ1bmN0aW9uKGMpe2MucWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLkl3O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMucWp8fHBhOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLnJqfHxxYTsobmV3IHFhKHIpKS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm1sPWI7Yi5wcm90b3R5cGU9e2hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLm1sfHxyYSx5Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ocig0KTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3RoaXMuc2coKTt0aGlzLnVnKCk7dGhpcy5Ubz0hMX0sc2c6ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuWmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5aYil7dmFyIGI9dGhpcy5HYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuWmI9ITApO3RoaXMuWihhKX19LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sSWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkplJiYoMCx0aGlzLkplKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5oa3x8c2E7KGZ1bmN0aW9uKGMpe2MuZ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuWGQ9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5QYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJgohdGhpcy51YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMucmEoKSx0aGlzLmdldFBsYXllcigpLlRvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS52ZCgpLGEua2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUGM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5OZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlFjLmluZGV4T2YoYSkmJgp0aGlzLlFjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5RYy5sZW5ndGg+PXRoaXMuWGQmJnRoaXMubSgpKX0sY3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5uZT90aGlzLm5lKys6dGhpcy5uZT0xOnRoaXMubWU/dGhpcy5tZSsrOnRoaXMubWU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSmgoYS52aWRlb1RhZyk/YS5aYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlBjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuWmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5na3x8dGE7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ycSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkVyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sVHc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnJxOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5pa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVqPXRoaXMuYVsyXTt0aGlzLnh1PXRoaXMuYVs2XTt0aGlzLnprPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMuVW49YjtiLnByb3RvdHlwZT17ZGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVqOnRoaXMud3UoYSl9LHd1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54dTp0aGlzLnlrKGEpfSx5azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuems6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlVufHx3YSx6Yz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuZGooNCk7KGZ1bmN0aW9uKGMpe2MuR209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVihhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0KYi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuVyYmdGhpcy5XKCl9LHllOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0scWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLkdtfHx4YTsoZnVuY3Rpb24oYyl7Yy5GbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRGM9dGhpcy55YT10aGlzLlVjPSExO3RoaXMudmg9ZS5HYigxMCk7dGhpcy5aaD0hMDt0aGlzLnJjPXRoaXMuUWc9ITE7dGhpcy54cyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLkNvKCksdGhpcy5xYigpKX0seHM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuemEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5YLCI7Iix0eXBlb2YgYi5YLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlg/Yi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5YP3R5cGVvZiBiLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRWE/Yi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5FYT90eXBlb2YgYi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLkVhP2IuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouRWE/dHlwZW9mIGIuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouVWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRGN9LENyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQXIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlVjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5VYz0hMCk7cmV0dXJuIHRoaXMuVWN9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5WYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5SdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LFJ0OmZ1bmN0aW9uKCl7dGhpcy5yYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGUuemEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sU3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSwKQ286ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxkZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlkpaG9tYWRVdGlscy5SYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkNyKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuVmIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuVmIoKSx0aGlzLnJjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMudygpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuVmIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5CYSgpO2JyZWFrfX0sRG86ZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy53Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMud2MhPWIuYWRzLnN0YXRlJiYodGhpcy53Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy53Yyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLndjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EbygpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQmE6ZnVuY3Rpb24oKXswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMudWEoKXx8KGJ8fCh0aGlzLlpoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLlpoLGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxJbzpmdW5jdGlvbigpe3RoaXMuYXh8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuUXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5XdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxXdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5GbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuS2god2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLktoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LEtoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnNlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubWF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgemE9Yy5IbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRrPXRoaXMuYVs0XTt0aGlzLmZrPXRoaXMuYVs0XTt0aGlzLnF3PXRoaXMuYVsxXTt0aGlzLnZsPXRoaXMuYVsyXTt0aGlzLnZ1PXRoaXMuYVs5XTt0aGlzLmpsPXRoaXMuYVs0XTt0aGlzLkJ1PXRoaXMuYVs1XTt0aGlzLm9qPXRoaXMuYVs0XTt0aGlzLkNqPQp0aGlzLmFbNF07dGhpcy5nbT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLlppPWI7Yi5wcm90b3R5cGU9e3NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50azp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZms6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnF3OnRoaXMudWwoYSl9LHVsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bDp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnU6dGhpcy5pbChhKX0saWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpsOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2o6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMuZm0oYSl9LGZtOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuZ206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5aaXx8QmEsQWM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuRWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5QZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sd3Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMuamEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuWWImJigwPD1oLmluZGV4T2YoZCl8fGEudmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlBlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLlBlKys7aWYoMTA8dGhpcy5QZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7CnZhciBDYT1jLkVsfHxDYTsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe2lmKCF0aGlzLm9lKWlmKHRoaXMuQ2J8fCh0aGlzLkNiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuQ2IrKywxNTx0aGlzLkNiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMub2U9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCl9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnlhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5VcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLlVwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2Iud3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuRGx8fERhOyhmdW5jdGlvbihjKXtjLkZsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVGE9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubWF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLkZsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuYm49dGhpcy5hWzhdO3RoaXMub3A9dGhpcy5hWzFdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOV19Yy5FbT1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXA6dGhpcy5hbihhKX0sYW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcDp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLnJ0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5FbXx8R2EsQmM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy55dD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PQpiLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnl0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuZ2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5nZCl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5XZyh0aGlzLmdkKTtlLnplKHRoaXMuZ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLAo1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmFrfHxIYTsoZnVuY3Rpb24oYyl7Yy4kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy4kanx8SWE7KGZ1bmN0aW9uKGMpe2MuYms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5UYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuQ2coYiwiZWxlbWVudElEIik7aWYoZS5XZyhhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5LYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5LYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIEphPWMuYmt8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xcz10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzVdO3RoaXMuUGk9dGhpcy5hWzFdO3RoaXMuJHQ9dGhpcy5hWzNdO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbN119Yy56bz1iO2IucHJvdG90eXBlPXtWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmltOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJHQ6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuem98fExhLENjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLlZzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Iaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxtdTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGduOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuSGp8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5lYj1hO3RoaXMueGc9CnRoaXMuaGk9ITE7dGhpcy5taD1kO3RoaXMuTGg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZWI9bmV3IHooYSkpO3ZhciBjPXRoaXMuc2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJmwmJmwuQ2UodGhpcy5lYi51cmwpJiZsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5tdSgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmthKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LApmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLklqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmViLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLnhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5MaD90aGlzLnNiLm9wZW4odGhpcy5lYi5tZXRob2QsdGhpcy5lYi51cmwsITEpOnRoaXMuc2Iub3Blbih0aGlzLmViLm1ldGhvZCx0aGlzLmViLnVybCwhMCksdGhpcy5oaXx8KHRoaXMuc2Iud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLAphWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5zYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuQ2UodGhpcy5lYi51cmwpP2wuS2Q/bC5rYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5DZSh0aGlzLmViLnVybCksdGhpcy5taCYmdGhpcy5taCgpfXJldHVybiB0aGlzLnNifX19KShjKTt2YXIgTWE9Yy5Janx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJhPSExO3RoaXMudWM9IiI7dGhpcy5jZT10aGlzLnRjPXRoaXMud2I9bnVsbDt0aGlzLmdwPXRoaXMuSWI9dGhpcy5kaD0hMTt0aGlzLkhhPSIiO3RoaXMuWWc9ITE7dGhpcy5EYT10aGlzLm1kPSIiO3RoaXMuVWc9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLktnPXRoaXMuY2M9IiI7dGhpcy5sZT0hMTt0aGlzLm1mPTA7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjsKdGhpcy5BZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuT2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmVjPSIiO3RoaXMuZmM9W107dGhpcy5nYz1bXTt0aGlzLklkPVtdO3RoaXMuZGM9IiI7dGhpcy5uZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNjPSExO3RoaXMuSm89dGhpcy5NZD1udWxsO3RoaXMuR2g9dGhpcy5qYz10aGlzLnBnPXRoaXMucWY9dGhpcy5LZD10aGlzLmZlPXRoaXMuVmQ9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5uZD0wO3RoaXMuTWc9ITE7dGhpcy5MZz0xRTM7dGhpcy5XYz0hMTt0aGlzLk9hPTFFMzt0aGlzLktmPSIifWMuSmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuUmEsCmFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuZGgsc2lkZWxvYWRzOnRoaXMuSWIsZGlzYWJsZXRlc3RzOnRoaXMuZ3AsaG9tYWRBbGlhczp0aGlzLkhhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5ZZyxnbG9iYWxDb25maWc6dGhpcy5tZCxjbGllbnRDb25maWc6dGhpcy5EYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlksaXNCbG9ja2VkOnRoaXMuVWcsc2VydmVyOnRoaXMuQWEsc3ZtQ29uZmlnOnRoaXMuY2MsaG9tYWRBZHBhdGg6dGhpcy5LZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmxlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm1mLEhPTUFEX1ZFUklGSUVEOnRoaXMuQ2YsSE9NQURfQkxPQ0tFRDp0aGlzLkFmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLk9iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmxjLApIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuQmYsdGVzdEhpZGU6dGhpcy5lYyx0ZXN0VGFnczp0aGlzLmZjLHRlc3RUYWdzSlM6dGhpcy5nYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5kYyx0aHJvdHRsZTp0aGlzLm5mLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuQ2MsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlZkLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5mZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5LZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5xZixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5iYixzZXJ2ZXJJZDp0aGlzLkRoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmpjLHNraXBBbGxvd2VkOnRoaXMuR2gsdm1hcHM6dGhpcy5laSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuV2MsYWRGYWxsYmFja1VSTDp0aGlzLktmfX0sCk9xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0sc3E6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLApkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5pbyhhKX0seGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlJhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkJlKGEpO2M9dGhpcy52YShhKTtmPyh0aGlzLnBkKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnpkKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMudWN8fHRoaXMud2J8fHRoaXMudGN8fHRoaXMuY2UpJiYoZz10aGlzLmtzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMudXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PQpnO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLnBkKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxwZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5BYSYmdGhpcy5BYS5sZW5ndGgmJjA8dGhpcy5BYS5sZW5ndGgmJihiPXRoaXMuQWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPQpiLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuQmUoYSk7cmV0dXJuIGJ9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5IYSYmMDx0aGlzLkhhLmxlbmd0aClyZXR1cm4gdGhpcy5IYTtmb3IoZCBpbiB0aGlzLkhhKWlmKGI9dGhpcy5IYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk53O3JldHVybiJub25lIn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BYVt0aGlzLkRoXX0semQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9kKCksYj10aGlzLkZoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLApiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxqczpmdW5jdGlvbihhLGIpe3ZhciBkPWUudmEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEg9MDtIPGcubGVuZ3RoO0grKyl7dmFyIGs9Z1tIXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLmpoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9CnRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxrczpmdW5jdGlvbihhKXt0aGlzLnVjJiYoYSs9dGhpcy51Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy50YyYmKGE9dGhpcy5qcyhhLHRoaXMudGMpKTtyZXR1cm4gYX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bD10aGlzO3RoaXMuWWc9ITA7dGhpcy5tZD1hO3RoaXMuRGE9Yjt0aGlzLlZlPWQ7dGhpcy5NZD1mO3RoaXMueGM9Yzt0aGlzLmJiPWV8fHt9O3RoaXMuWnIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuRGEpdGhpcy5YcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5EYSl0cnl7dGhpcy5EYT0KYigpLHRoaXMuWmMoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFpyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLm1kK3RoaXMuJGQoImdsb2JhbCIpKSx0aGlzLktxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLiRlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuWmMoKX0uYmluZCh0aGlzKSwhMCl9LFhyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLkRhK3RoaXMuJGQoImNsaWVudCIsLTEhPXRoaXMuRGEuaW5kZXhPZigiPyIpKSksdGhpcy5aYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy4kZSgiY2xpZW50Iik7dGhpcy5rYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5HYigpKTt0aGlzLmJiJiZ0aGlzLmJiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5iYiYmdGhpcy5iYi5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGthOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKXt0aGlzLmZlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnhjPSExKTt0aGlzLnhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueGM/dGhpcy54YygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuVWc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkFmKSk7dGhpcy5MYigpO2UueWMoay5wdCk7KGI9ZS5CYyh0aGlzLm9kKCkpKXx8KGI9ZS5CYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sS3E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkRhfHx0aGlzLmNjfHx0aGlzLkhhfHx0aGlzLlpjKCk6KHRoaXMuUmE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLk9iKSksdGhpcy5MYigpKX19LFpjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLkRhfWVsc2UgYT10aGlzLkRhO3RoaXMuaXNFbmFibGVkPXRoaXMuaGMoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLmNjPWEuY29uZmlnfHwiIjt0aGlzLkhhPWEuYWxpYXN8fG51bGw7dGhpcy5LZz1hLmFkcGF0aHx8IiI7dGhpcy5sZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkRoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuY2MmJnRoaXMuSGEmJnRoaXMuQWEubGVuZ3RoP3RoaXMuRWMoITEpOih0aGlzLlJhPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLkxiKCkpfSxFYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLnpkKCkpLGQ9dGhpcy52YSh0aGlzLmNjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuY2MrdGhpcy4kZCgiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMuSnUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuJGUoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMua2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwKMTAwKSk6dGhpcy5FYyghMCl9LmJpbmQodGhpcyksITApfX0sSnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5DYz0hMDt0aGlzLkVjKCEwKTtyZXR1cm59fXRoaXMuS2Q9dGhpcy5oYyhiLnN0cmljdCk7dGhpcy5xZj10aGlzLmhjKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnBnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmhjKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuZWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5nYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy51Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8Cm51bGw7dGhpcy50Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZGg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5JYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1iLnZwYWlkfHwhMTt0aGlzLmJiLnZwYWlkPXRoaXMuamM7dGhpcy5HaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlhjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5laT1iLnZtYXBzfHwiIjt0aGlzLldjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1iLmJpdHJhdGV8fDFFMzt0aGlzLktmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmRjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuQnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmxlJiYodGhpcy5kYz1udWxsKTt0aGlzLm5mPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPQpiLnZpZGVvcGxhemF8fHt9OyF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5DYz0hMCx0aGlzLkVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmJ2KCkmJih0aGlzLmVjfHx0aGlzLmdjfHx0aGlzLmZjfHx0aGlzLmRjfHx0aGlzLklkKT90aGlzLlZlPyh0aGlzLlJhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMuaGUoKSx0aGlzLkxiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5PdSgpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuUHUoKX0sUHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUuZmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMuYmImJnRoaXMuYmIucGxheWVyJiZ0aGlzLmJiLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5rYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLkxiKCl9LExjOmZ1bmN0aW9uKGEpe3RoaXMuVmQ9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLkxiKCksdGhpcy5oZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmVjKXt2YXIgYT1lLmZkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5iaCgpKXRoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5lYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuUGgoKX19ZWxzZSB0aGlzLlBoKCl9LE9oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkdiKCkpO3RoaXMuU3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmpmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MYyh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmZjPXRoaXMuSWQpJiZ0aGlzLmZjLmxlbmd0aCl7dmFyIGQ9dGhpcy5mYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmpmKCl9LFN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxQaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigpKTt0aGlzLlR1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5PaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuZ2MmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZD10aGlzLmdjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuT2goKX0sVHU6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxqZjpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMubWYrKyx0aGlzLklhKG5ldyB6KHRoaXMuZGMpLHRoaXMuTHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5NaCgpfSxrZjpmdW5jdGlvbihhKXt0aGlzLkxjKHRoaXMuQmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxMdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5tZj90aGlzLmpmKCk6dGhpcy5rZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuTWgoKTp0aGlzLmtmKCJBQUEiKX0sTWg6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTsKdGhpcy5MYigpO3RoaXMuaGUoKX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxMYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5TYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlZkJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS56YSgidC1vbmxpbmUuZGUiKXx8ZS56YSgiZ2lnYS5kZSIpfHxlLnphKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmJoKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkNmKSk7dGhpcy5NZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk1kJiZ0aGlzLk1kKCl9LEdvOmZ1bmN0aW9uKCl7aWYodGhpcy5xZiYmCnRoaXMuT3EoKSl7dmFyIGE9dGhpcy5zcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sVGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5uZHx8KHRoaXMubmQ9MCk7dGhpcy5uZCsrO3RoaXMubmQ+dGhpcy5MZyYmIXRoaXMuTWcmJih0aGlzLk1nPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5MZywhMCkpO2E9bmV3IE1hKGEsYixkKTtmJiYoYS5oaT0hMCk7YyYmZS5GcigpJiYoYS54Zz0hMCk7ZyYmKGEuTGg9ITApO3JldHVybiBhLmxvYWQoKX0sRW86ZnVuY3Rpb24oKXtlLlNhKCl8fGUuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmthKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnBkKCl8fChhPXRoaXMudmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZWl9LEZvOmZ1bmN0aW9uKCl7dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkd2LmJpbmQodGhpcyksdGhpcy5Gdi5iaW5kKHRoaXMpKX0sR3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLk9wKCl9LEZ2OmZ1bmN0aW9uKCl7fSxPcDpmdW5jdGlvbigpe2UueWMoay5OcCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5rYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0saGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkliLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkliW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlphKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5pYSgpXT10aGlzO2UuWmEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5uZn0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEdiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0saGM6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEZoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsaCxjO2ZvcihoPTc7MDw9aDtoLS0pYz1hPj4+NCpoJjE1LGQrPWMudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGU9QXJyYXkoODApLGc9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHI9MzI4NTM3NzUyMCxuLHAsdSx0LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj0KYS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGYpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyllW2ZdPXdbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspZVtmXT1kKGVbZi0zXV5lW2YtOF1eZVtmLTE0XV5lW2YtMTZdLDEpO2M9ZztuPWs7cD1sO3U9bTt0PXI7Zm9yKGY9MDsxOT49ZjtmKyspdj1kKGMsNSkrKG4mcHx+biZ1KSt0K2VbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj00MDs1OT49ZjtmKyspdj1kKGMsNSkrKG4mcHxuJnV8cCZ1KSt0K2VbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NjA7Nzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2c9ZytjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7cj1yK3QmNDI5NDk2NzI5NX1yZXR1cm4oYihnKStiKGspK2IobCkrYihtKStiKHIpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5Kanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaXA9CnRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLlprPXRoaXMuYVsxMF07dGhpcy5vbz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs5XX1jLk5yPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLnBzKGEpfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXM6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlwOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ldDp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWms6dGhpcy5ubyhhKX0sbm86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgT2E9Yy5Ocnx8T2EsRGM9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkxxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5QP3RoaXMuJGE9YS5mLlAoKTp0aGlzLiRhPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnZkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuQmguYmluZCh0aGlzKSxtdXRlOnRoaXMuS2UuYmluZCh0aGlzKSx1bm11dGU6dGhpcy50di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVGI9dGhpcy5WYz0hMTt0aGlzLmZvPTFFMzt0aGlzLnBhPW51bGw7dGhpcy5MPWI7dGhpcy5OYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMucm89ZS5hYSgxMCk7dGhpcy5mZj0wO3RoaXMuVGM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5UYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJgooKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuVGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubm49ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5uaD10aGlzLkVkPSExO3RoaXMuZ2g9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLlpkPSExO3RoaXMuV2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5ZYj0hMTt0aGlzLlZvPWUuYWEoMTApO3RoaXMuRmI9ZS5hYSgxMCk7dGhpcy5EYj1lLmFhKDEwKTt0aGlzLkhoPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5qZT10aGlzLmNkPXRoaXMuaGY9dGhpcy5yYj10aGlzLmtjPXRoaXMucGg9dGhpcy5oZD10aGlzLmN2PXRoaXMudWI9dGhpcy5FYj0hMTt0aGlzLnBjPVtdOwp0aGlzLiRiPXt9O3RoaXMuaHQ9MjAwO3RoaXMueGY9dGhpcy55Zj10aGlzLmVlPXRoaXMud2Y9dGhpcy5VZT0hMTt0aGlzLnVkPXt9fWMuRGo9YjtiLnByb3RvdHlwZT17aHU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy4kYV0mJnRoaXMuY29uZlt0aGlzLiRhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuJGFdW2FdKTtyZXR1cm4gYn0sVWg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuWGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLkdkKCJjYWxsIix0aGlzLldhKCkpO2UudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEZlOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMudWI9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlkpdGhpcy5mZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLAp0aGlzLkwuR28oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlJhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlVoKCksbmV3IFModGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuVWgoKSxuZXcgUyh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKToKdGhpcy5QYSgpO2Vsc2V7dmFyIHNjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3NjLkZlKGEsYixkKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7YS5YYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5oZD0hMTt0aGlzLmM9YTt0aGlzLnR1KHRoaXMuYyk7dGhpcy51ZD1uZXcgUGEodGhpcy5jLkl2LHRoaXMudmlkZW8se30pO3RoaXMuSGcoYSk7dGhpcy5wYz10aGlzLnpnKGEpO3RoaXMuUW8oKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5FcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ucShhKSkpOwpyZXR1cm4gY30sbnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LEVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0KMDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlhhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZWQmJmEuZWQuZXJyb3ImJmEuZWQuZXJyb3IuY29kZSYmKGI9YS5lZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk5jLmNvZGU6Yj09Ri5SZC5jb2RlP2UudihrLmR3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSwKdGhpcy5CKCksdGhpcy5DKCkpOihlLkdlKCksYj09Ri5GZi5jb2RlJiZlLnYoay55cyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay5NcCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuR2QoImVtcHR5Iix0aGlzLldhKCkpO3RoaXMuVWEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5HZi5jb2RlOmUudihrLm93LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuc3csdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudihrLnpzLHRoaXMuYy5BLAp0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay5Edix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuemYuY29kZTplLnYoay5Fdix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5VYihhKTt0aGlzLlBhKCl9LFViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgYz1hLk5hLnBvcCgpO3RoaXMuRWUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHR1OmZ1bmN0aW9uKGEpe3RoaXMuamU9ITE7dGhpcy5OYj10aGlzLmIuSzsKdmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuTmIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlVlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXg9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTsKdGhpcy5ubiYmdGhpcy5wbGF5ZXIucGUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnBlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5obihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuVWUmJmIubG9hZCgpO2lmKHRoaXMuUWgoYikpe3RoaXMuR2QoInNldHVwIix0aGlzLldhKCkpO3RoaXMubG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlVlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPQp0aGlzLnBhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUm8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5wYS5hcHBlbmRDaGlsZChiKSx0aGlzLnJ1KCkpOnRoaXMuYy5vcmlnaW4ucWcody5RZCl9LHJ1OmZ1bmN0aW9uKCl7dGhpcy53Zj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmI9ITApO2UuaWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJmUubW4odGhpcy5jLm9yaWdpbi5zYSk7CmUuZmIoInNldFVwVnBhaWQiKTt0aGlzLkdkKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnFoKCk7dGhpcy5iLmRmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5kZigpO3RoaXMucGE9dGhpcy5OYj10aGlzLmIuSzt0aGlzLmFpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5KYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuSHEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmFlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLldiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnBjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuU3YoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5UdigpLHRoaXMuYi5XYighMCksIXRoaXMuTWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuTWI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkFlKHRoaXMuTWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5XYighMCksdGhpcy5YdigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuV2IoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWnYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuJHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5idygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5TYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5oZyx0aGlzLmMuQSwKdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLldjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy55ZiYmKHRoaXMueGY9ITEsdGhpcy5iYygpKSx0aGlzLlZ2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnJiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5KYigibXV0ZWQiLCJ1c2VyIiksZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkpiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnBmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLllkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLmFlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5YZihmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5XZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5rYz0hMH0sVnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMua2M9ITF9LFh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sCld2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlNmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZmIoImltcHJlc3Npb24iKTt0aGlzLkloKCk7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZmIoInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxadjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmhkPSEwO2UuZmIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sJHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpOwplLmZiKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5mYigidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMuc2YoKTtlLmZiKCJjb21wbGV0ZSIpO3RoaXMuVmEoImNvbXBsZXRlIil9LGZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZmIoImFkc3RvcHBlZCIpO3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuaWUoKTsKdGhpcy5IPSExO3RoaXMuUGEoYSl9fSxTdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLmZiKCJlcnIiLGIpO2UudihrLmN3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5maSghMCl9LGhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuUmEmJmIuaXNFbmFibGVkJiYhYi5wZCgpKXt2YXIgZD1iLnZhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsCnRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuTnYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxRaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sbG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuYmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxiaTpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGJ8fHRoaXMudWYoYSl9LmJpbmQodGhpcyksdGhpcy5mbykpfSx1ZjpmdW5jdGlvbihhKXtpZighdGhpcy5WYyYmdGhpcy5RaCh0aGlzLnZpZGVvKSYmIXRoaXMuRWImJiF0aGlzLlRiKXt0aGlzLlZjPSEwO3RyeXtpZighZS5TYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRWJ8fCh0aGlzLkViPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMuS3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5kZigpO3RoaXMuSnYoKTt0aGlzLmFpKCk7dGhpcy5hZygpO3RoaXMuYi5xaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5nZigpfX0sZ2Y6ZnVuY3Rpb24oKXt0aGlzLmNkfHx0aGlzLk1mKCl9LE1mOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuY2R8fChhP3RoaXMuUGEoKToodGhpcy5LZSghMCksdGhpcy5NZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmFjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0uYmluZCh0aGlzKTt0aGlzLnJlKCkuRWgodGhpcyl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5FYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLmNuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5QYSgpfSxQYTpmdW5jdGlvbihhKXtpZighdGhpcy5qZSlpZih0aGlzLmplPQohMCx0aGlzLk5kfHwoZS52KGsuQnMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5uYyl7ZS5vYigibmV3U21hbGxBZElkIik7dGhpcy5mZisrO3RoaXMuVGI9dGhpcy5WYz0hMTt0cnl7dGhpcy5BZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLk5iLnJlbW92ZUNoaWxkKHRoaXMucGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5ZaCgpfWNhdGNoKGcpe310aGlzLmhmPSEwO3RoaXMuYi52ZSgpO3RoaXMuWWI9ITE7dGhpcy5yZSgpLnpoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLkxlKCk7dGhpcy5jLm5jJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5rZSgpKX1lbHNlIHRoaXMua2UoKX0sTnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7CnRoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50ZihhKSl9LHRmOmZ1bmN0aW9uKGEpe3RoaXMuVGI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLkVvKCk7dGhpcy5jLm9yaWdpbi5xZyh3LlFkKX0sY2k6ZnVuY3Rpb24oKXtpZih0aGlzLmN2KXRoaXMuUGEoKTtlbHNle3RoaXMuWWI9ITA7dGhpcy5iLmYuSmEmJiF0aGlzLmhmJiZ0aGlzLmIuZi5KYSgpJiZlLnYoay5hZCx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5mdihhKTtpZighdGhpcy5NYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmCih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5NYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuQWUodGhpcy5NYil9Yz0iIjt0aGlzLmMuZWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGgpKSYmKGM9dGhpcy5jLmVmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSwKdGhpcy5FZHx8KHRoaXMuRWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMudGI/KHRoaXMuVGI9dGhpcy5WYz0hMSx0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5OYi5yZW1vdmVDaGlsZCh0aGlzLnBhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLlloKCksdGhpcy5jLm9yaWdpbi5MZSgpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlRjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlpkPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxWaDpmdW5jdGlvbigpe3RoaXMucGh8fAoodGhpcy5waD0hMCx0aGlzLmhkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sZnY6ZnVuY3Rpb24oYSl7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLldofHx0aGlzLkVifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuVmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZoKCl9LmJpbmQodGhpcykpLHRoaXMuRWJ8fHRoaXMuSWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5WYSgic3RhcnQiKSxlLnYoay5PZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksCnRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5qYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmhkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5RZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLAoidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuV2g9YSl9LEdkOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxJaDpmdW5jdGlvbigpe2UudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLHRoaXMuV2EoKSwhMCl9LFVhOmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX2hkX2FkX2Vycm9yIixhLCEwKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMud2Z8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxKYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkViKXt0aGlzLnVkJiZ0aGlzLnVkLnRyYWNrJiZ0aGlzLnVkLnRyYWNrKGEpOwppZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5GcSh0aGlzLmMuTmEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRHIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5FZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZG4sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKGcudXJsLApnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuY3AodGhpcy5jLk5hLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWUuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLndmJiYoYj0iX3ZwYWlkIik7dGhpcy55ZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxFZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC54YShhKSxjJiZiLmduKGMpLGZ8fChmPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuam4oYSksdGhpcy5MLklhKGIsZnVuY3Rpb24oKXt0aGlzLnloKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGpuOmZ1bmN0aW9uKGEpe3RoaXMuJGJbYV09Im9wZW4ifSx5aDpmdW5jdGlvbihhKXt0aGlzLiRiW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuJGI9e319LEZ1OmZ1bmN0aW9uKCl7dmFyIGE9CjAsYjtmb3IoYiBpbiB0aGlzLiRiKXRoaXMuJGIuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy4kYltiXSYmYSsrO3JldHVybiBhfSxGcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGNwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEt2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mdi5iaW5kKHRoaXMpKX0sTHY6ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmJjKCk6dGhpcy5jLlNiJiYoZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KIl90b3AiO3RoaXMuTC5XYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5TYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuU2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxKdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLAphLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5UYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5YYyYmKGI9dGhpcy5MLlhjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnBhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJgp0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxhaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuVm87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuRmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5TaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuYmMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkRiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ldi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5kdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkhoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmVmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXToKKGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLnBhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5YZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi5xYSYmdGhpcy5iLmYucWEoKSYmKGUudihrLmlnLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5LZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGJjOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLnhmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuUmMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxTaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMua2M/KGUubGEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuSmIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwidXNlciIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMucmI/KGUubGEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sS2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwiY29udGVudCIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx0djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5KYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LGFjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmFjKTt0aGlzLmNkfHx0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0sa2U6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuZmQoKTshdGhpcy5MLmpjfHxlLlNhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5lZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5uaD8odGhpcy5jZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLmpnKCkpOih0aGlzLm5oPXRoaXMueWY9dGhpcy54Zj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKSx0aGlzLmVlPSEwLGE9ZS4kZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5GZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5GdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLHRoaXMuaHQpOih0aGlzLmhmPSEwLHRoaXMuYi52ZSgpLHRoaXMuYi5ZdCgpLHRoaXMuWWI9ITEsZS52KGsuVW8sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnJlKCkuemgoKSl9LHJlOmZ1bmN0aW9uKCl7dmFyIGE9Cm51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxhZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLnplKHRoaXMudmlkZW8sYSk/dGhpcy5CaCgpOnRoaXMudmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5TYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnBjJiYwPHRoaXMucGMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnBjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT0Ke307YS5hZHNlc3Npb25faWQ9dGhpcy5ybysiLSIrdGhpcy5mZjt0aGlzLmMmJnRoaXMuYy5EZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuRGcoKSk7cmV0dXJuIGF9LG9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5Eanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXY9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzZdO3RoaXMuY2w9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5WcT1iO2IucHJvdG90eXBlPXt4djpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXY6dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNpOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuVnF8fApSYSxFYz1uZXcgUmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy54dig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkNhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMub2M9dGhpcy5xYz0hMTt0aGlzLnNhPSIiO3RoaXMudmY9ITE7ZCYmZC5lbXB0eT90aGlzLmJzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuZmQoKSxiO2I9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7CmMmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOmwueGEobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLmxnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT0KY3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC54YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnhhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5hcy5iaW5kKHRoaXMpLHRoaXMuWXIuYmluZCh0aGlzKSl9LApBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5DYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuWGIpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7CnZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuQ2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLlhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5YYnx8dGhpcy5JcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5LdSgpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrCiciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtmW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxJcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmCmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGFzOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMuQ2E9YS5yZXNwb25zZVhNTCx0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuU2QpKX10aGlzLlg9dGhpcy5BZygpO3RoaXMucWM9dGhpcy5sZigpO3RoaXMub2M9dGhpcy5OaCgpOwp0aGlzLlgubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuUWEody5OYyx7ZXJyb3I6dGhpcy52Zj9GLlJkOkYuRWZ9KSl9LGJzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUWEody5TZCkpfXRoaXMuWD10aGlzLkFnKCk7dGhpcy5xYz10aGlzLmxmKCk7dGhpcy5vYz10aGlzLk5oKCk7dGhpcy5YLmxlbmd0aD90aGlzLkdjKCk6dGhpcy5vYSh0aGlzLlFhKHcuTmMse2Vycm9yOnRoaXMudmY/Ri5SZDpGLkVmfSkpfSxZcjpmdW5jdGlvbigpe3RoaXMub2EodGhpcy5RYSh3LkRmLHtkZXB0aDphfSkpfSxHYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLktyKCk/dGhpcy5VdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLklnKCksaCx7QWRTeXN0ZW06dGhpcy5tcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5vYSh0aGlzLlFhKHcuR2YpKTooYT0wLHRoaXMuQnYoKSYmdGhpcy5RZSh0aGlzLldvKCkpKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkdjKCkpOnRoaXMucGFyZW50LkxlKCl9LGtoOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5raCgpfSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ1KCk/dGhpcy5RdSgpPyEwOigtMSE9dGhpcy56YygpP3RoaXMub2EodGhpcy5RYSh3LlBkKSk6dGhpcy5vYSh0aGlzLlFhKHcuemYpKSwhMSk6KHRoaXMub2EodGhpcy5RYSh3Lk5jLEYuRmYpKSwhMSl9LFFlOmZ1bmN0aW9uKGEpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLk5hPWEuTmEuY29uY2F0KHRoaXMuSGUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWGE9CmEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuUWUoYSl9LFdvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLmR1cmF0aW9uPXRoaXMuemMoKTthLk89dGhpcy5GZygpO2EuU2I9dGhpcy5vcSgpO2EuSXY9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5scSgpO2EuZWY9dGhpcy5EcShhLmR1cmF0aW9uKTthLlhhPWEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLlhhPWIuWGE/Yi5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5OYT1iLmVycm9yLmNvZGUhPXcuUGQuY29kZT9iLk5hLmNvbmNhdCh0aGlzLnBxKCkpOmIuTmEuY29uY2F0KHRoaXMueXEoKSkpOwp0aGlzLlgubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5VYiYmdGhpcy5wYXJlbnQuVWIoYiksYT0wLHRoaXMuR2MoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxVYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5VYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUWEoYSxiKSl9LFFhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxSdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy56YygpfSxsZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxOaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMubGYoKSYmKGE9ITApO3JldHVybiBhfSxKdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMudmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sS3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LG1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxIZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0KIkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0seXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sCnBxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxvcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxPdzphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD0KYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5sZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxEcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkN1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubGQoYSk6IiJ9LGxkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9rPXRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVsxMF07dGhpcy5Qbz10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLlRwPWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMub2s6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhrOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qbzp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLlRwfHxVYSxGYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5uayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk5hPVtdO3RoaXMuTz1bXTt0aGlzLlNiPSIiO3RoaXMuQT10aGlzLm5jPXRoaXMudGI9ITE7dGhpcy53ZT10aGlzLm9yaWdpbj1udWxsO3RoaXMueGU9IiJ9Yy5NbD1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx3cTpmdW5jdGlvbigpe2lmKCF0aGlzLndlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkNhKXt2YXIgYT10aGlzLm9yaWdpbi5DYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLndlPWFbY10pfXJldHVybiB0aGlzLndlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueGUpcmV0dXJuIHRoaXMueGU7dmFyIGE9IiI7KGE9dGhpcy53cSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMueGU9YX0sSHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLk1sfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUG49dGhpcy5hWzZdO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuYXI9dGhpcy5hWzVdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5maj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUG46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkpwOnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hcjp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLmZqfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Obig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsCk1hOiJYTUxfUEFSU0VfRVJST1IifSx6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTWE6IkRVUkFUSU9OX0VSUk9SIn0sTmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE1hOiJFTVBUWV9WQVNUIn0sR2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTWE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LERmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsCm1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixNYToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixNYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEZ3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLApNYToiTUVESUFGSUxFX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTWE6IkRVTU1ZX0FEIn19LEY9e0VmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTWE6Ik5PX0FEUyJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixNYToiTk9fTUVESUFGSUxFUyJ9LEd3Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE1hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTWE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19CmMuVmo9YjtiLnByb3RvdHlwZT17bnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Wanx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMubnMoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5lZD1iO3RoaXMuTmE9W107dGhpcy5vcmlnaW49bnVsbH1jLmtqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5ranx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3E9dGhpcy5hWzVdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMuZmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19CmMudnA9YjtiLnByb3RvdHlwZT17anE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54aTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLnZwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5qcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuQWg9YTt0aGlzLnZpZGVvPWI7dGhpcy5MZD1bXTt0aGlzLnhoPVtdO3RoaXMuTWU9W107dGhpcy5Ndj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLlBrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuQWgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5BaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBnPWUuY29udGVudFdpbmRvdztnLml4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlZ0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLk90LmJpbmQodGhpcyl9O3ZhciBrPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwprLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztnLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7Zy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspO3RoaXMuTGQucHVzaCh7c3JjOmMsZnJhbWU6ZSxtdDpmLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5NZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLk1lW2JdO2MudHlwZT09PWEmJmMueW8odGhpcy5xcShhKSl9fSxxcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntyeDohMCxxeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntleDoidmlkZW8iLHR4OiJqc0N1c3RvbSIsdXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsdng6MSxQdzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEdxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5MZC5sZW5ndGg7YisrKWlmKHRoaXMuTGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5MZFtiXS5tdDtyZXR1cm4iIn0sVnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLkdxKGIpLHZlbmRvcjpifSk7CnRoaXMuRHUoKX0sT3Q6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk12Lm1hcChmdW5jdGlvbihhKXt0aGlzLllmKGEsYil9LmJpbmQodGhpcykpOnRoaXMuWWYoYSxiKX0sWWY6ZnVuY3Rpb24oYSxiKXt0aGlzLk1lLnB1c2goe3R5cGU6YSx5bzpiLG94OiExfSl9LER1OmZ1bmN0aW9uKCl7dGhpcy54aC5tYXAoZnVuY3Rpb24oYSl7YS5Hcnx8KGEuaHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Hcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUGE9Yy5Qa3x8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXM9dGhpcy5hWzNdO3RoaXMudnY9dGhpcy5hWzEwXTt0aGlzLiRvPQp0aGlzLmFbOV07dGhpcy5xbj10aGlzLmFbMV07dGhpcy5Xbj10aGlzLmFbM107dGhpcy5Ibj10aGlzLmFbMV07dGhpcy5hbD10aGlzLmFbOV07dGhpcy5rcD10aGlzLmFbOF07dGhpcy5qdD10aGlzLmFbNV07dGhpcy5Qaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs2XX1jLktrPWI7Yi5wcm90b3R5cGU9e2xzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tczp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnY6dGhpcy5abyhhKX0sWm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRvOnRoaXMucG4oYSl9LHBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xbjp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV246dGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhuOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hbDp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmtwOnRoaXMuaXQoYSl9LGl0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qdDp0aGlzLk9qKGEpfSxPajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLktrfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5scyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmliPWEuQmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5SYj1bXX1jLlZpPWI7Yi5wcm90b3R5cGU9e2dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuZ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6Cihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxJdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFloOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSwKcWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5hZCx0aGlzLmYucygpKX0sWXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5iZCx0aGlzLmYucygpKSl9LGRmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmliLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5JYyYmdGhpcy5mLkljKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPQpiLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWnAodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy52ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSWMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsKInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5SYi5sZW5ndGg7YSsrKXRoaXMuUmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5KaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLldiLmJpbmQodGhpcyksMTApfSxYZjpmdW5jdGlvbihhKXt0aGlzLlJifHwodGhpcy5SYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuUmIucHVzaChhKX0sdmU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5WaXx8WmEsQz1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzddO3RoaXMuRWs9dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzhdO3RoaXMuWWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5Jbj1iO2IucHJvdG90eXBlPXtndjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5odjp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3M6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVrOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGw6dGhpcy5YaShhKX0sWGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgYWI9Yy5Jbnx8YWIsS2M9bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZ3YoNCk7KGZ1bmN0aW9uKGMpe2MuQWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5CZChiKTt0aGlzLm1nKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx5ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYmI9Yy5BbHx8YmI7KGZ1bmN0aW9uKGMpe2Muemw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuUWI9dGhpcy5RYnx8ITE7dGhpcy5QZj10aGlzLlJmPXRoaXMuUmc9dGhpcy5lYT10aGlzLm9mPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuVnAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm9mPSEwO3RoaXMuUmcmJnRoaXMuZ2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuWWMoKTsKdGhpcy5SZz0hMDt0aGlzLmdnKCl9LmJpbmQodGhpcykpO3RoaXMuY2coKX0sZ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5ZYygpO2lmKCF0aGlzLm9mJiYhdGhpcy5ZYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMub2YmJnRoaXMuUGYmJiF0aGlzLlJmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0sWWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApjZzpmdW5jdGlvbigpe2lmKHRoaXMuWWMoKSl7dmFyIGI9dGhpcy5HZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuUGY9Yi5Nd310aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN4KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSx6cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxWcDpmdW5jdGlvbihiLGEpe3RoaXMuUWI9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRjKCl9LmJpbmQodGhpcyksMTAwKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi55ZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLnpxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuemx8fGNiOyhmdW5jdGlvbihjKXtjLkJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkhyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlNsLiRtLlltP3dpbmRvdy5PTy5TbC4kbS5ZbS5LdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnNlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBiYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgY2IoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuVms9dGhpcy5hWzZdO3RoaXMuZXM9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzNdO3RoaXMudHQ9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMua209YjtiLnByb3RvdHlwZT17VWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZrOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lczp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXA6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmI9Yy5rbXx8ZmIsTGM9bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuVWsoNCk7KGZ1bmN0aW9uKGMpe2MuSGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5KZygpfSxKZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVihiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy50aCgpfSx0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuSGl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOwoxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy50YSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnRhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmRnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBoYj1jLkdpfHxoYjsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LHdoOmZ1bmN0aW9uKGIpe2I9bmV3IGdiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaGIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XcHx8KHRoaXMuV3A9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLndoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBpYj1jLklpfHxpYixUPW5ldyBpYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs4XX1jLnZ3PWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYj1jLnZ3fHxqYixNYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5mcig0KTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxJYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuZG18fFU7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuU2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlNjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTXMoYSl9LmJpbmQodGhpcykpO3kuU2MoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5TYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuTnEoKX0sTXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLmNtfHxWOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy50ZCYmKGI9ZS5mcChiLHRoaXMudGQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnRkfHwodGhpcy50ZD1bXSksdGhpcy50ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sU2M6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFZ1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuRmN8fCh0aGlzLkZjPVtdKSx0aGlzLkZjLnB1c2goYiksdGhpcy5YdCgpJiYodGhpcy5YZSgpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxOcTpmdW5jdGlvbigpe2lmKHRoaXMuRmMpZm9yKHZhciBiPTA7Yjx0aGlzLkZjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuRmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5WdShiKX19KX0pKGMpO3ZhciBrYj1jLmVtfHxrYix5PW5ldyBrYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlxPXRoaXMuYVsxMF07dGhpcy5Ncj10aGlzLmFbNF07dGhpcy5ibT10aGlzLmFbMl07dGhpcy55cD10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbM107dGhpcy5Cbj10aGlzLmFbMTBdO3RoaXMuJG49CnRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzJdfWMudm89YjtiLnByb3RvdHlwZT17aHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYm06dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlwOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zczp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm46dGhpcy5abihhKX0sWm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy4kbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYj1jLnZvfHxsYixOYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaHEoNCk7KGZ1bmN0aW9uKGMpe2MuRGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxKYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLkRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5FaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5FaXx8bmI7KGZ1bmN0aW9uKGMpe2MuRmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgbWIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgbmIoZSx0aGlzLkkpKS5nKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5GaXx8b2IscGI9bmV3IG9iKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJsPXRoaXMuYVszXTt0aGlzLm1yPXRoaXMuYVsyXTt0aGlzLnhqPXRoaXMuYVsxXTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs5XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLkZzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLnd2PWI7Yi5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuUmw6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1yOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXE6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkpzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWI9Yy53dnx8cWIsT2M9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUWwoNCk7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5WKGIpO3RoaXMuWihhKTt0aGlzLk50KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMub2x8fHJiOyhmdW5jdGlvbihjKXtjLm5sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpO3RoaXMuZ2k9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZ2kmJih0aGlzLkcoKSx0aGlzLmdpPSEwLHRoaXMucmEoKSk7YS5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgc2I9Yy5ubHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyByYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBzYihjLAp0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHRiPWMucGx8fHRiLFc9bmV3IHRiKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmh3PXRoaXMuYVsyXTt0aGlzLlB2PXRoaXMuYVs0XTt0aGlzLnhyPXRoaXMuYVs0XTt0aGlzLm1qPXRoaXMuYVs5XTt0aGlzLlByPXRoaXMuYVsxXTt0aGlzLmZ1PXRoaXMuYVs2XTt0aGlzLlJrPXRoaXMuYVs3XTt0aGlzLlNwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuWnU9YjtiLnByb3RvdHlwZT17Z3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh3OnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qdjp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHI6dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1qOgp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ1OnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sazp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB1Yj1jLlp1fHx1YixQYz1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5ndyg0KTsoZnVuY3Rpb24oYyl7Yy5KbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxMYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy5KbXx8dmI7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEx0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9W10pO3RoaXMuYWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnRhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnlhP3RoaXMuTHQodGhpcy55YSk6KHRoaXMueWE9dGhpcy5WYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnlhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMucmMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuYWImJnRoaXMuYWIubGVuZ3RoJiYxPHRoaXMuYWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5hYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuYWJbYV0mJjMwMyE9dGhpcy5hYlthXSYmNDAzIT10aGlzLmFiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy50YSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5JbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB2YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHdiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB4Yj1jLkttfHwKeGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVs1XTt0aGlzLnZuPXRoaXMuYVs3XTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnV3PXRoaXMuYVsxXTt0aGlzLlJuPXRoaXMuYVs1XTt0aGlzLkl0PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuQ209YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFwOnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYXQ6dGhpcy50dyhhKX0sdHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51dzp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm46dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkl0Ogp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHpiPWMuQ218fHpiLFFjPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLlBwKDQpOyhmdW5jdGlvbihjKXtjLlhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlJlPSExfSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy54dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHh0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlJlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlJlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEV1OmZ1bmN0aW9uKCl7dGhpcy5SZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuWGx8fEFiOyhmdW5jdGlvbihjKXtjLldsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5pYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ocz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5ocz8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuV2x8fEJiOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBCYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIENiPWMuWWx8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdj10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNF07dGhpcy5Mcz10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbN107dGhpcy5Daz10aGlzLmFbM107dGhpcy5icD10aGlzLmFbMV07dGhpcy5udj10aGlzLmFbMl07dGhpcy5Zbz10aGlzLmFbN107dGhpcy5Scj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLmptPWI7Yi5wcm90b3R5cGU9CntrdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubHY6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVyOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mczp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNrOnRoaXMuYXAoYSl9LGFwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5icDp0aGlzLm12KGEpfSxtdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnY6dGhpcy5YbyhhKX0sWG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllvOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBFYj1jLmptfHxFYixSYz1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5VbHx8RmI7KGZ1bmN0aW9uKGMpe2MuVGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5TbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmtkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5XcigpOnRoaXMuZmcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxTbzpmdW5jdGlvbigpe3RoaXMuTmYoKXx8dGhpcy5tKCEwKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtkKCk7IWIubmEmJmIuWCYmYi5KdyYmYi5MdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMua2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sa2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5vaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMub2g9YltjXSk7cmV0dXJuIHRoaXMub2h9LApkeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5rZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBGYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEdiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEhiPWMuVmx8fEhiLEliPW5ldyBIYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdj10aGlzLmFbM107dGhpcy5taz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxMF19Yy5XaT1iO2IucHJvdG90eXBlPXtwdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXY6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgSmI9Yy5XaXx8SmIsU2M9bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ClNjLnB2KDQpOyhmdW5jdGlvbihjKXtjLklrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sYng6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxKYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPQpjLklrfHxYOyhmdW5jdGlvbihjKXtjLkhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlNlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuU2U9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5TZSYmYiE9dGhpcy5TZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLnphKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS5qeCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmCih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhrfHxZOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5YZSgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxLYj1jLkprfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV0PXRoaXMuYVs2XTt0aGlzLlJqPXRoaXMuYVs2XTt0aGlzLmNqPXRoaXMuYVs2XTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbMl07dGhpcy5xcj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5mcz1iO2IucHJvdG90eXBlPXtEdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXQ6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Sajp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY2o6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmp2OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Uazp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTW46dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTWI9Yy5mc3x8TWIsVGM9bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuRHQoNCk7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGd4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuemp8fE5iOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5PbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIE9iPWMueWp8fE9iOyhmdW5jdGlvbihjKXtjLkFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE5iKGJbYV0pO2MubWF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IE9iKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTsKdmFyIFBiPWMuQWp8fFBiLFFiPW5ldyBQYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ZcD10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbN107dGhpcy5UbT10aGlzLmFbNF07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Ddz10aGlzLmFbNV07dGhpcy5TcT10aGlzLmFbMl07dGhpcy5Vcz10aGlzLmFbMTBdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtYcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlFzOnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5UbTp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmk6dGhpcy5CdyhhKX0sQnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/CnRoaXMuQ3c6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNxOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Vczp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmI9Yy5zanx8UmIsVWM9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuWHAoNCk7KGZ1bmN0aW9uKGMpe2MuUW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT0KYS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlYoYSl9ZWxzZSB0aGlzLmNhKCl9LE10OmZ1bmN0aW9uKCl7dGhpcy5PZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuT2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk9kfHwodGhpcy5PZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LApKYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFNiPWMuUW18fFNiOyhmdW5jdGlvbihjKXtjLlBtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFF0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMudmMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy52YyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLnZjKGEpfS5iaW5kKHRoaXMpKX0sdmM6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LEpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy52Yyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5RdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLkpmKCk7dGhpcy5QdCgpfSxQdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsZnVuY3Rpb24oYil7dGhpcy52YyhiKX0uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuS3Q9ITB9fSl9KShjKTt2YXIgVGI9Yy5QbXx8VGI7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFRiKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFViPWMuUm18fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3Y9dGhpcy5hWzVdO3RoaXMua3I9dGhpcy5hWzldO3RoaXMuRm49dGhpcy5hWzhdO3RoaXMua2s9CnRoaXMuYVs4XTt0aGlzLkJpPXRoaXMuYVs2XTt0aGlzLlh1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVs3XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmZxPWI7Yi5wcm90b3R5cGU9e3J2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zdjp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3I6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZuOnRoaXMuamsoYSl9LGprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5razp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQmk6dGhpcy5XdShhKX0sV3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlh1OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdDp0aGlzLk1tKGEpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5mcXx8V2IsVmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMucnYoNCk7KGZ1bmN0aW9uKGMpe2MudW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5yaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LApQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucmgmJih0aGlzLnJoPSEwLHRoaXMuVyYmdGhpcy5XKCkpfX0pfSkoYyk7dmFyIE89Yy51bXx8TzsoZnVuY3Rpb24oYyl7Yy50bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy5DYnx8KHRoaXMuQ2I9MCksdGhpcy5DYisrLDE1PHRoaXMuQ2Ipe2lmKHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnlhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnRtfHxQOyhmdW5jdGlvbihjKXtjLnZtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLlRhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj0KbmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuWGUoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBYYj1jLnZtfHwKWGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV3PXRoaXMuYVsxMF07dGhpcy54bz10aGlzLmFbM107dGhpcy5VaT10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbM107dGhpcy5sbD10aGlzLmFbMV07dGhpcy51cj10aGlzLmFbOV07dGhpcy5MbD10aGlzLmFbNl07dGhpcy56bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLll1PWI7Yi5wcm90b3R5cGU9e0R3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG86dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zcDp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGw6dGhpcy50cihhKX0sCnRyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy55bShhKX0seW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgWmI9Yy5ZdXx8WmIsV2M9bmV3IFpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9V2MuRHcoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSk7YSYmdGhpcy5WKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5xa3x8WjsoZnVuY3Rpb24oYyl7Yy5waz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkRjPXRoaXMueWE9dGhpcy5VYz0hMTt0aGlzLnZoPWUuR2IoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9CmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuT2crKztpZigxMDx0aGlzLk9nKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fAotMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTsKYnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy50YSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLnBrfHxhYTsoZnVuY3Rpb24oYyl7Yy5yaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9CjA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciAkYj1jLnJrfHwkYixhYz1uZXcgJGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzFdO3RoaXMudms9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdO3RoaXMuZ3Q9dGhpcy5hWzJdO3RoaXMuR3A9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMl19Yy53cD1iO2IucHJvdG90eXBlPQp7cG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFvOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52azp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHM6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmd0OnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJjPWMud3B8fGJjLFhjPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLnBvKDQpOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLAphPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLnVqfHxjYzsoZnVuY3Rpb24oYyl7Yy50aj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMudGp8fApkYzsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubWEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBkYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGVjPWMudmp8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbD10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbMl07dGhpcy5ibz10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbNV07CnRoaXMuQm09dGhpcy5hWzNdO3RoaXMueG49dGhpcy5hWzRdO3RoaXMuTWs9dGhpcy5hWzhdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMucXA9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5Vaj1iO2IucHJvdG90eXBlPXtHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5JcShhKX0sSXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpxOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm86dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG46dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1rOnRoaXMuTWooYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Oajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLnFwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgZ2M9Yy5Vanx8Z2MsWWM9bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuR2woNCk7KGZ1bmN0aW9uKGMpe2Muamk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5WKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBoYz1jLmppfHxoYzsoZnVuY3Rpb24oYyl7Yy5paT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLAoxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgaWM9Yy5paXx8aWM7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxZYTpmdW5jdGlvbihiKXtiPW5ldyBoYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGljKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLllhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5ZYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYz1jLmtpfHxqYyxrYz1uZXcgamMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ1PXRoaXMuYVsyXTt0aGlzLnJsPXRoaXMuYVs4XTt0aGlzLlpqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMucnc9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5idTp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucmw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgbGM9Yy5yd3x8bGMsWmM9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuYXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9CnRoaXMuYWg9dGhpcy4kZz0hMTt0aGlzLndkPVtdO3RoaXMuV2U9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBZYj9udWxsOlliLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuT2w9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5BcShhKTpbXSxiO3RoaXMuYWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuJGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuQ2goYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLlpnKWJyZWFrOwpiPXRoaXMuV2VbY107dGhpcy5yZihiKSYmKHRoaXMud2QucHVzaChiKSx0aGlzLkNoKGIpKX19LHJmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5yZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxDaDpmdW5jdGlvbihhKXt0aGlzLnJmKGEpJiZhLmcoKX0sR3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHQmJiF0aGlzLiRnKWZvcih0aGlzLlpnPSEwLGE9MDthPHRoaXMud2QubGVuZ3RoO2ErKyl0aGlzLndkW2FdLktiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2RbYV0uS2IpfX19KShjKTt2YXIgbWM9Yy5PbHx8bWMsTT1uZXcgbWM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLlhqPXRoaXMuYVsxMF07dGhpcy5Pcz10aGlzLmFbNl07dGhpcy5HdD10aGlzLmFbMV07dGhpcy52dD10aGlzLmFbNV07dGhpcy5jcT10aGlzLmFbMTBdO3RoaXMuQ3A9dGhpcy5hWzEwXTt0aGlzLlhxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuWnM9YjtiLnByb3RvdHlwZT17S286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxvOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yajp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3M6dGhpcy5GdChhKX0sRnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HdDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNxOnRoaXMuQnAoYSl9LEJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ3A6dGhpcy5XcShhKX0sCldxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYz1jLlpzfHxuYywkYz1uZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5Lbyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueWMoay5DdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueWMoay5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBhZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHFjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS55cigpLHtpZDpiZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuTm89dGhpcy5hWzZdO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsxXTt0aGlzLm90PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVs2XTt0aGlzLkRzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTG09YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhtOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMud3M6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmRrOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTm86dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5obDp0aGlzLktqKGEpfSxLajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGo6dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm90OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Hazp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWGs6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5MbXx8b2MsY2Q9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLldtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zaD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMucmQ9MDt0aGlzLiRhPSIiO3RoaXMueGQ9W107dGhpcy55ZD0wO3RoaXMudWg9ITE7dGhpcy5UZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5saT1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLnNoPWF9LGJmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxpdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy4kYV1bYV0pOwpyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oYSxiKXtlLnphKCJ3ZWx0LmRlIikmJmUuWmEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy56cigpKXRoaXMubGIubCh0aGlzLmxiLm1kLHRoaXMubGIuRGEsdGhpcy5sYi5WZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLnhjKTtlbHNlIGlmKHRoaXMuUHEoKSl0aGlzLmN1KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmUudihrLmFkLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5JdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFFhKGwsdGhpcy5sYixnKTtsLmh1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5ncyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuRWgobCl9fSx6cjpmdW5jdGlvbigpe3ZhciBhPQpuZXcgRGF0ZSxiPTA7aWYodGhpcy5yZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnJkLmdldFRpbWUoKSx0aGlzLnJkPWEsM0U1PGI/ITA6ITE7dGhpcy5yZD1hO3JldHVybiExfSx6dTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmFmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5GYSgiYWRUYWciKTt0aGlzLkZhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5GYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMucmcoYSkpP3RoaXMuSmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX0seXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuYWYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLm91KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5yZyhjKSk/dGhpcy5KYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX19LHJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxUdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnN1KHRoaXMueXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTGEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuYWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuSmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuYmQsdGhpcy5wbGF5ZXIucygpKSl9fSxTdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm51KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSWUoKX0sZzpmdW5jdGlvbigpe3RoaXMuenUoKTt0aGlzLnBsYXllci5JZSYmdGhpcy5TdCgpO3RoaXMuVHQoKX0sVXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy54ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMud3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLAphW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy55ZD10aGlzLnhkLmxlbmd0aH0sUHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMueWQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy51aD1hO2ZvcihhPTA7YTx0aGlzLnhkLmxlbmd0aDthKyspdGhpcy54ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkJ0LmJpbmQodGhpcykpfSxCdDpmdW5jdGlvbihhKXt0aGlzLnlkLS07YSYmdGhpcy5UZS5wdXNoKGEpOzA+PXRoaXMueWQmJnRoaXMudWgoKX0sZ3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVGUubGVuZ3RoO2MrKyliPXRoaXMuVGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMubGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm9pPXRoaXMuYVs2XTt0aGlzLlZyPXRoaXMuYVsxMF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubnc9dGhpcy5hWzVdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMua3c9dGhpcy5hWzFdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMub209dGhpcy5hWzFdO3RoaXMudXM9dGhpcy5hWzhdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5ycz1iO2IucHJvdG90eXBlPXtuaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2k6dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZyOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qajp0aGlzLmx3KGEpfSxsdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnc6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF2OnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5rdzp0aGlzLnh3KGEpfSx4dzpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnl3OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vbTp0aGlzLnRzKGEpfSx0czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXM6dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5yc3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQubmkoNCl9KS5jYWxsKGNlaVF1YWVmaGFpQnV4YWUsY2VpUXVhZWZoYWlCdXhhZSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
144.76.9.6
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.6.9.76.144.clients.your-server.de
- Software
-
openresty/1.15.8.2 /
- Resource Hash
- ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
|
GET
DATA
|
200
OK
|
truncated
Show response
/
Frame C1BC
|
241 B
0
|
|
Script
text/javascript |
|
|
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/334b447183bafb9ec5df3b09f785f7113caa448b/
Frame 4650
|
109 B
671 B
|
109ms
36ms
|
XHR
application/json |
136.243.244.75
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/334b447183bafb9ec5df3b09f785f7113caa448b/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGNlaVF1YWVmaGFpQnV4YWU9Y2VpUXVhZWZoYWlCdXhhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5aYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5zbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5hZCxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlJhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuYmYoYyk7YS5qdShsKTthLml1KG0pO2EuVXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkliLmxlbmd0aCl7dmFyIGE9bC5JYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG49dGhpcy5hWzZdO3RoaXMuTHA9dGhpcy5hWzZdO3RoaXMueG09dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5IcD1iO2IucHJvdG90eXBlPXtDbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG46dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSHB8fGhhLHJjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zbz0hMTt0aGlzLlhiPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQXQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLk5nPXt9O3RoaXMuWmU9ITF9Yy5Gaj1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LEFjOmZ1bmN0aW9uKCl7dGhpcy5aZXx8KHRoaXMuWmU9ZS5hYSgxMCkpO3JldHVybiB0aGlzLlplfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuTmdbYV0mJih0aGlzLk5nW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLAp0aGlzLkh1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnp0KGEuZGF0YSl9LAp6dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LGxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudHEoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmVoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KbmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sa246ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy52YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmVxKGEpKXJldHVybjsoYj10aGlzLmxnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT0KYX19LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxmYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHNlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sQ2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6CiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxKaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxXZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LHplOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCwKZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOwowPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZShhKX0uYmluZCh0aGlzKSwxMDApfSxHYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDwKYTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9CjA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHQucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLQo4XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt4PWs7dT1sO3I9bTtmb3IoZj0wOzE5Pj1mO2YrKylwPWQocSw1KSsobiZ4fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrCmIoZykrYihrKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7CnJldHVybiBifSxGcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5SYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxTYTpmdW5jdGlvbigpe3ZhciBhPXtDaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxacTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSwKQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEFrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxobzpmdW5jdGlvbigpe3JldHVybiBhLkNpKCl8fGEuSmkoKXx8YS5acSgpfHxhLkNsKCl8fGEuT20oKXx8YS5BaygpfHxhLiRsKCl9fTtyZXR1cm4gbnVsbCE9YS5obygpfSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEJjOmZ1bmN0aW9uKGEpe2E9dGhpcy52YShhKS5ob3N0LnNwbGl0KCIuIik7CnZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LENxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudmEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxmcDpmdW5jdGlvbihhLApiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sQ3U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuWGgoYikrIjoiK3RoaXMuWGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxhZjpmdW5jdGlvbihhKXt0aGlzLlhiPQphfSx2ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlhiO3RoaXMuVmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHljOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLllhKGIsZCkpO2ImJihCPWsuWWEoYSxiKSk7ZiYmKEI9ay5ZYShCLGYpKTtxJiYoQj1rLllhKEIscSkpO2MmJihCPWsuWWEoQixjKSk7ZyYmKEI9ay5ZYShCLGMpKTtlLnljKEIpfSxDdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmCjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTtiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DdChhKTtpZihiKWlmKCFsfHwKIWwuWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuemQoKTtsLnhhKGEsITApO2E9bC54YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pOwp0aGlzLk1jW2ZdfHwodGhpcy5NY1tmXT0wKTt0aGlzLk1jW2ZdKys7MTA8dGhpcy5NY1tmXXx8KGY9bC56ZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC54YShmLCEwKSxmPWwueGEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsCihmWzBdP2ZbMF06IiIpKyhmWzFdP2ZbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sR2U6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuRm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxxZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMua2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmxkKGEpOiIifSxsZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSwKYixkLGYpe2Q9ITE7aWYoYi5CZShhKXx8dGhpcy5KcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LlllJiZ3aW5kb3cuc2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7CmQmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLlphKGEsYi5IYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5vZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5rbihlLGEpO3JldHVybiBlfSxaYTpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godGMpe2ModGMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7CmVsc2V7bS54YShhLGUpO2U9bS54YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uSWEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYKMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LCRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLktjKWZvcih2YXIgYyBpbiB0aGlzLktjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuS2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKToKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYSxmLkhhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy4kcihmLm9kKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LYz1hfSx3dzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuWmEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTsKZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0saW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxEcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5Ganx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Faj1iO2IuWWE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnB0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLk1wPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iuc3c9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5MZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuUWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuVWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmNuPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkh2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaGc9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Vbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmJkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuYWQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlNmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5lbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUmM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLldkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLllkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuZG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmRpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuQnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5zZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi5wZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuaWc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmN3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkR2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIuRXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkN2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpO3ZhciBrPWMuRWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnc9dGhpcy5hWzhdO3RoaXMuZW89dGhpcy5hWzNdO3RoaXMudGk9dGhpcy5hWzRdO3RoaXMuVGo9dGhpcy5hWzhdO3RoaXMubW09dGhpcy5hWzldO3RoaXMuY3I9CnRoaXMuYVsyXTt0aGlzLnNyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLnJuPWI7Yi5wcm90b3R5cGU9e2V3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mdzp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZW86dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50aTp0aGlzLlNqKGEpfSxTajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVGo6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1tOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jcjp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLnJufHxqYSx1Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuZXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Haj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHhxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lKwpuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxqZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuamQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5qZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudWUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5qZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sVGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLnhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuamQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuR2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXc9dGhpcy5hWzNdO3RoaXMuQXA9dGhpcy5hWzJdO3RoaXMuYXY9dGhpcy5hWzEwXTt0aGlzLnZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs0XX1jLmR1PWI7Yi5wcm90b3R5cGU9e3p3OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuQXc6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFwOnRoaXMuJHUoYSl9LCR1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmR1fHxrYSx2Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy56dyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuUWk9Yn0pKGMpO3ZhciBMPWMuUWl8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGk9dGhpcy5hWzddO3RoaXMuaGo9dGhpcy5hWzEwXTt0aGlzLnpuPXRoaXMuYVs0XTt0aGlzLnJpPQp0aGlzLmFbOV07dGhpcy5Ucj10aGlzLmFbOV07dGhpcy50bj10aGlzLmFbMTBdO3RoaXMuT2s9dGhpcy5hWzNdO3RoaXMua289dGhpcy5hWzVdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuS249dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy53bD1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTGk6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhqOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bjp0aGlzLnBpKGEpfSxwaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucmk6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRyOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG46dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmtvOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jdDp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLndsfHxsYSx3Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuS2E9e307dGhpcy5JPW51bGw7dGhpcy5IYz0xMDA7dGhpcy5IYj0wO3RoaXMuVGE9MTUwO3RoaXMuS2I9MDt0aGlzLmt1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYT8odGhpcy5IYisrLHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuSGMpKTowPnRoaXMuVGEmJih0aGlzLktiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IYj50aGlzLlRhPyEwOiExfSxYZTpmdW5jdGlvbigpe3RoaXMuSGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGt1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5LYVtiLmphKCldPWI7TSYmTS5haCYmTS5HdShiKX0sV3c6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZSh0aGlzLkthKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9LEVyOmZ1bmN0aW9uKGIpe2I9Yi5HYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkthKWlmKGIuaWQ9PQp0aGlzLkthW2FdLkdhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG54OmZ1bmN0aW9uKGIpe3RoaXMuS2FbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBwPWMuTmx8fHA7KGZ1bmN0aW9uKGMpe2MuUGw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5IYz0xMDt0aGlzLkhiPTA7dGhpcy5UYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLm5nPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuR2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTGE6ZnVuY3Rpb24oKXt9LApzdTpmdW5jdGlvbihiKXt0aGlzLlc9Yn0sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XfSxudTpmdW5jdGlvbihiKXt0aGlzLkplPWJ9LFZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmV9LEllOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYSYmKHRoaXMuSGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkhjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHB4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlFxKCl8fHRoaXMuZm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxKYTpmdW5jdGlvbigpe3JldHVybiExfSxmeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEljOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRWg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSx6aDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sJHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGt4OmZ1bmN0aW9uKCl7dGhpcy5uZ3x8KHRoaXMubmc9ITApfSxwZTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5QbHx8dDsoZnVuY3Rpb24oYyl7Yy5taT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkhmPSIxIjt0aGlzLklmPSIyIjt0aGlzLlptPSIzIjt0aGlzLk9jPTA7dGhpcy5paD0KMzA7dGhpcy5QYj1bXTt0aGlzLmdiPVtdO3RoaXMubWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuV2Y9dGhpcy4kaD0hMTt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5iZihiKTt0aGlzLmx1KGEpfSxnOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3RoaXMuJGh8fCh0aGlzLiRoPSEwLGUuR2UoKSl9LE5lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5ZYiYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9CmUuQWMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLkFjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT0xfSxCcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldLmluaXRpYXRvciE9ZS5BYygpJiYodGhpcy5jZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnVhKCkpe3RoaXMudnIoKTtpZighdGhpcy5CcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5jZigpO3JldHVybn10aGlzLmNmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5UaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLAphKXt0aGlzLnVhKCl8fCh0aGlzLlBiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sVGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1lLnVuaXF1ZSh0aGlzLlBiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5tY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm1jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMubWNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLApiLCEwLGEpfX0sWnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSGZ9LGNmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0scXU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlptfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuT2N9LE5mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkhmfSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5JZn0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuT2N9LGJmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sbHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LHZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sY3M6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLm1pfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbN107dGhpcy5KbD10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMTBdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuZXA9YjtiLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zbjp0aGlzLklsKGEpfSxJbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkpsOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tcDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc206dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFxOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7CnZhciBuYT1jLmVwfHxuYSx4Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Ybig0KTsoZnVuY3Rpb24oYyl7Yy5waj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5wanx8b2E7KGZ1bmN0aW9uKGMpe2MucWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLkl3O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMucWp8fHBhOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLnJqfHxxYTsobmV3IHFhKHIpKS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm1sPWI7Yi5wcm90b3R5cGU9e2hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLm1sfHxyYSx5Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ocig0KTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3RoaXMuc2coKTt0aGlzLnVnKCk7dGhpcy5Ubz0hMX0sc2c6ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuWmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5aYil7dmFyIGI9dGhpcy5HYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuWmI9ITApO3RoaXMuWihhKX19LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sSWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkplJiYoMCx0aGlzLkplKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5oa3x8c2E7KGZ1bmN0aW9uKGMpe2MuZ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuWGQ9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5QYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJgohdGhpcy51YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMucmEoKSx0aGlzLmdldFBsYXllcigpLlRvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS52ZCgpLGEua2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUGM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5OZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlFjLmluZGV4T2YoYSkmJgp0aGlzLlFjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5RYy5sZW5ndGg+PXRoaXMuWGQmJnRoaXMubSgpKX0sY3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5uZT90aGlzLm5lKys6dGhpcy5uZT0xOnRoaXMubWU/dGhpcy5tZSsrOnRoaXMubWU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSmgoYS52aWRlb1RhZyk/YS5aYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlBjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuWmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5na3x8dGE7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ycSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkVyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sVHc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnJxOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5pa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVqPXRoaXMuYVsyXTt0aGlzLnh1PXRoaXMuYVs2XTt0aGlzLnprPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMuVW49YjtiLnByb3RvdHlwZT17ZGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVqOnRoaXMud3UoYSl9LHd1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54dTp0aGlzLnlrKGEpfSx5azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuems6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlVufHx3YSx6Yz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuZGooNCk7KGZ1bmN0aW9uKGMpe2MuR209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVihhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0KYi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuVyYmdGhpcy5XKCl9LHllOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0scWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLkdtfHx4YTsoZnVuY3Rpb24oYyl7Yy5GbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRGM9dGhpcy55YT10aGlzLlVjPSExO3RoaXMudmg9ZS5HYigxMCk7dGhpcy5aaD0hMDt0aGlzLnJjPXRoaXMuUWc9ITE7dGhpcy54cyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLkNvKCksdGhpcy5xYigpKX0seHM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuemEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5YLCI7Iix0eXBlb2YgYi5YLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlg/Yi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5YP3R5cGVvZiBiLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRWE/Yi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5FYT90eXBlb2YgYi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLkVhP2IuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouRWE/dHlwZW9mIGIuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouVWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRGN9LENyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQXIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlVjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5VYz0hMCk7cmV0dXJuIHRoaXMuVWN9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5WYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5SdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LFJ0OmZ1bmN0aW9uKCl7dGhpcy5yYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGUuemEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sU3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSwKQ286ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxkZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlkpaG9tYWRVdGlscy5SYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkNyKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuVmIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuVmIoKSx0aGlzLnJjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMudygpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuVmIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5CYSgpO2JyZWFrfX0sRG86ZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy53Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMud2MhPWIuYWRzLnN0YXRlJiYodGhpcy53Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy53Yyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLndjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EbygpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQmE6ZnVuY3Rpb24oKXswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMudWEoKXx8KGJ8fCh0aGlzLlpoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLlpoLGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxJbzpmdW5jdGlvbigpe3RoaXMuYXh8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuUXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5XdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxXdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5GbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuS2god2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLktoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LEtoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnNlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubWF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgemE9Yy5IbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRrPXRoaXMuYVs0XTt0aGlzLmZrPXRoaXMuYVs0XTt0aGlzLnF3PXRoaXMuYVsxXTt0aGlzLnZsPXRoaXMuYVsyXTt0aGlzLnZ1PXRoaXMuYVs5XTt0aGlzLmpsPXRoaXMuYVs0XTt0aGlzLkJ1PXRoaXMuYVs1XTt0aGlzLm9qPXRoaXMuYVs0XTt0aGlzLkNqPQp0aGlzLmFbNF07dGhpcy5nbT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLlppPWI7Yi5wcm90b3R5cGU9e3NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50azp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZms6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnF3OnRoaXMudWwoYSl9LHVsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bDp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnU6dGhpcy5pbChhKX0saWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpsOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2o6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMuZm0oYSl9LGZtOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuZ206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5aaXx8QmEsQWM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuRWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5QZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sd3Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMuamEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuWWImJigwPD1oLmluZGV4T2YoZCl8fGEudmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlBlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLlBlKys7aWYoMTA8dGhpcy5QZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7CnZhciBDYT1jLkVsfHxDYTsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe2lmKCF0aGlzLm9lKWlmKHRoaXMuQ2J8fCh0aGlzLkNiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuQ2IrKywxNTx0aGlzLkNiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMub2U9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCl9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnlhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5VcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLlVwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2Iud3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuRGx8fERhOyhmdW5jdGlvbihjKXtjLkZsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVGE9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubWF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLkZsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuYm49dGhpcy5hWzhdO3RoaXMub3A9dGhpcy5hWzFdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOV19Yy5FbT1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXA6dGhpcy5hbihhKX0sYW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcDp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLnJ0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5FbXx8R2EsQmM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy55dD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PQpiLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnl0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuZ2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5nZCl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5XZyh0aGlzLmdkKTtlLnplKHRoaXMuZ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLAo1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmFrfHxIYTsoZnVuY3Rpb24oYyl7Yy4kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy4kanx8SWE7KGZ1bmN0aW9uKGMpe2MuYms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5UYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuQ2coYiwiZWxlbWVudElEIik7aWYoZS5XZyhhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5LYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5LYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIEphPWMuYmt8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xcz10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzVdO3RoaXMuUGk9dGhpcy5hWzFdO3RoaXMuJHQ9dGhpcy5hWzNdO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbN119Yy56bz1iO2IucHJvdG90eXBlPXtWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmltOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJHQ6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuem98fExhLENjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLlZzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Iaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxtdTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGduOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuSGp8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5lYj1hO3RoaXMueGc9CnRoaXMuaGk9ITE7dGhpcy5taD1kO3RoaXMuTGg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZWI9bmV3IHooYSkpO3ZhciBjPXRoaXMuc2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJmwmJmwuQ2UodGhpcy5lYi51cmwpJiZsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5tdSgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmthKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LApmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLklqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmViLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLnhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5MaD90aGlzLnNiLm9wZW4odGhpcy5lYi5tZXRob2QsdGhpcy5lYi51cmwsITEpOnRoaXMuc2Iub3Blbih0aGlzLmViLm1ldGhvZCx0aGlzLmViLnVybCwhMCksdGhpcy5oaXx8KHRoaXMuc2Iud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLAphWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5zYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuQ2UodGhpcy5lYi51cmwpP2wuS2Q/bC5rYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5DZSh0aGlzLmViLnVybCksdGhpcy5taCYmdGhpcy5taCgpfXJldHVybiB0aGlzLnNifX19KShjKTt2YXIgTWE9Yy5Janx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJhPSExO3RoaXMudWM9IiI7dGhpcy5jZT10aGlzLnRjPXRoaXMud2I9bnVsbDt0aGlzLmdwPXRoaXMuSWI9dGhpcy5kaD0hMTt0aGlzLkhhPSIiO3RoaXMuWWc9ITE7dGhpcy5EYT10aGlzLm1kPSIiO3RoaXMuVWc9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLktnPXRoaXMuY2M9IiI7dGhpcy5sZT0hMTt0aGlzLm1mPTA7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjsKdGhpcy5BZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuT2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmVjPSIiO3RoaXMuZmM9W107dGhpcy5nYz1bXTt0aGlzLklkPVtdO3RoaXMuZGM9IiI7dGhpcy5uZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNjPSExO3RoaXMuSm89dGhpcy5NZD1udWxsO3RoaXMuR2g9dGhpcy5qYz10aGlzLnBnPXRoaXMucWY9dGhpcy5LZD10aGlzLmZlPXRoaXMuVmQ9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5uZD0wO3RoaXMuTWc9ITE7dGhpcy5MZz0xRTM7dGhpcy5XYz0hMTt0aGlzLk9hPTFFMzt0aGlzLktmPSIifWMuSmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuUmEsCmFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuZGgsc2lkZWxvYWRzOnRoaXMuSWIsZGlzYWJsZXRlc3RzOnRoaXMuZ3AsaG9tYWRBbGlhczp0aGlzLkhhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5ZZyxnbG9iYWxDb25maWc6dGhpcy5tZCxjbGllbnRDb25maWc6dGhpcy5EYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlksaXNCbG9ja2VkOnRoaXMuVWcsc2VydmVyOnRoaXMuQWEsc3ZtQ29uZmlnOnRoaXMuY2MsaG9tYWRBZHBhdGg6dGhpcy5LZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmxlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm1mLEhPTUFEX1ZFUklGSUVEOnRoaXMuQ2YsSE9NQURfQkxPQ0tFRDp0aGlzLkFmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLk9iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmxjLApIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuQmYsdGVzdEhpZGU6dGhpcy5lYyx0ZXN0VGFnczp0aGlzLmZjLHRlc3RUYWdzSlM6dGhpcy5nYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5kYyx0aHJvdHRsZTp0aGlzLm5mLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuQ2MsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlZkLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5mZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5LZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5xZixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5iYixzZXJ2ZXJJZDp0aGlzLkRoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmpjLHNraXBBbGxvd2VkOnRoaXMuR2gsdm1hcHM6dGhpcy5laSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuV2MsYWRGYWxsYmFja1VSTDp0aGlzLktmfX0sCk9xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0sc3E6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLApkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5pbyhhKX0seGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlJhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkJlKGEpO2M9dGhpcy52YShhKTtmPyh0aGlzLnBkKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnpkKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMudWN8fHRoaXMud2J8fHRoaXMudGN8fHRoaXMuY2UpJiYoZz10aGlzLmtzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMudXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PQpnO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLnBkKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxwZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5BYSYmdGhpcy5BYS5sZW5ndGgmJjA8dGhpcy5BYS5sZW5ndGgmJihiPXRoaXMuQWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPQpiLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuQmUoYSk7cmV0dXJuIGJ9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5IYSYmMDx0aGlzLkhhLmxlbmd0aClyZXR1cm4gdGhpcy5IYTtmb3IoZCBpbiB0aGlzLkhhKWlmKGI9dGhpcy5IYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk53O3JldHVybiJub25lIn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BYVt0aGlzLkRoXX0semQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9kKCksYj10aGlzLkZoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLApiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxqczpmdW5jdGlvbihhLGIpe3ZhciBkPWUudmEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEg9MDtIPGcubGVuZ3RoO0grKyl7dmFyIGs9Z1tIXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLmpoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9CnRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxrczpmdW5jdGlvbihhKXt0aGlzLnVjJiYoYSs9dGhpcy51Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy50YyYmKGE9dGhpcy5qcyhhLHRoaXMudGMpKTtyZXR1cm4gYX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bD10aGlzO3RoaXMuWWc9ITA7dGhpcy5tZD1hO3RoaXMuRGE9Yjt0aGlzLlZlPWQ7dGhpcy5NZD1mO3RoaXMueGM9Yzt0aGlzLmJiPWV8fHt9O3RoaXMuWnIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuRGEpdGhpcy5YcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5EYSl0cnl7dGhpcy5EYT0KYigpLHRoaXMuWmMoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFpyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLm1kK3RoaXMuJGQoImdsb2JhbCIpKSx0aGlzLktxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLiRlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuWmMoKX0uYmluZCh0aGlzKSwhMCl9LFhyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLkRhK3RoaXMuJGQoImNsaWVudCIsLTEhPXRoaXMuRGEuaW5kZXhPZigiPyIpKSksdGhpcy5aYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy4kZSgiY2xpZW50Iik7dGhpcy5rYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5HYigpKTt0aGlzLmJiJiZ0aGlzLmJiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5iYiYmdGhpcy5iYi5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGthOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKXt0aGlzLmZlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnhjPSExKTt0aGlzLnhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueGM/dGhpcy54YygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuVWc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkFmKSk7dGhpcy5MYigpO2UueWMoay5wdCk7KGI9ZS5CYyh0aGlzLm9kKCkpKXx8KGI9ZS5CYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sS3E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkRhfHx0aGlzLmNjfHx0aGlzLkhhfHx0aGlzLlpjKCk6KHRoaXMuUmE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLk9iKSksdGhpcy5MYigpKX19LFpjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLkRhfWVsc2UgYT10aGlzLkRhO3RoaXMuaXNFbmFibGVkPXRoaXMuaGMoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLmNjPWEuY29uZmlnfHwiIjt0aGlzLkhhPWEuYWxpYXN8fG51bGw7dGhpcy5LZz1hLmFkcGF0aHx8IiI7dGhpcy5sZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkRoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuY2MmJnRoaXMuSGEmJnRoaXMuQWEubGVuZ3RoP3RoaXMuRWMoITEpOih0aGlzLlJhPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLkxiKCkpfSxFYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLnpkKCkpLGQ9dGhpcy52YSh0aGlzLmNjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuY2MrdGhpcy4kZCgiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMuSnUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuJGUoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMua2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwKMTAwKSk6dGhpcy5FYyghMCl9LmJpbmQodGhpcyksITApfX0sSnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5DYz0hMDt0aGlzLkVjKCEwKTtyZXR1cm59fXRoaXMuS2Q9dGhpcy5oYyhiLnN0cmljdCk7dGhpcy5xZj10aGlzLmhjKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnBnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmhjKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuZWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5nYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy51Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8Cm51bGw7dGhpcy50Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZGg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5JYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1iLnZwYWlkfHwhMTt0aGlzLmJiLnZwYWlkPXRoaXMuamM7dGhpcy5HaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlhjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5laT1iLnZtYXBzfHwiIjt0aGlzLldjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1iLmJpdHJhdGV8fDFFMzt0aGlzLktmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmRjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuQnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmxlJiYodGhpcy5kYz1udWxsKTt0aGlzLm5mPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPQpiLnZpZGVvcGxhemF8fHt9OyF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5DYz0hMCx0aGlzLkVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmJ2KCkmJih0aGlzLmVjfHx0aGlzLmdjfHx0aGlzLmZjfHx0aGlzLmRjfHx0aGlzLklkKT90aGlzLlZlPyh0aGlzLlJhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMuaGUoKSx0aGlzLkxiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5PdSgpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuUHUoKX0sUHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUuZmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMuYmImJnRoaXMuYmIucGxheWVyJiZ0aGlzLmJiLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5rYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLkxiKCl9LExjOmZ1bmN0aW9uKGEpe3RoaXMuVmQ9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLkxiKCksdGhpcy5oZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmVjKXt2YXIgYT1lLmZkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5iaCgpKXRoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5lYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuUGgoKX19ZWxzZSB0aGlzLlBoKCl9LE9oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkdiKCkpO3RoaXMuU3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmpmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MYyh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmZjPXRoaXMuSWQpJiZ0aGlzLmZjLmxlbmd0aCl7dmFyIGQ9dGhpcy5mYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmpmKCl9LFN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxQaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigpKTt0aGlzLlR1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5PaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuZ2MmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZD10aGlzLmdjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuT2goKX0sVHU6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxqZjpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMubWYrKyx0aGlzLklhKG5ldyB6KHRoaXMuZGMpLHRoaXMuTHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5NaCgpfSxrZjpmdW5jdGlvbihhKXt0aGlzLkxjKHRoaXMuQmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxMdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5tZj90aGlzLmpmKCk6dGhpcy5rZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuTWgoKTp0aGlzLmtmKCJBQUEiKX0sTWg6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTsKdGhpcy5MYigpO3RoaXMuaGUoKX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxMYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5TYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlZkJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS56YSgidC1vbmxpbmUuZGUiKXx8ZS56YSgiZ2lnYS5kZSIpfHxlLnphKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmJoKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkNmKSk7dGhpcy5NZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk1kJiZ0aGlzLk1kKCl9LEdvOmZ1bmN0aW9uKCl7aWYodGhpcy5xZiYmCnRoaXMuT3EoKSl7dmFyIGE9dGhpcy5zcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sVGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5uZHx8KHRoaXMubmQ9MCk7dGhpcy5uZCsrO3RoaXMubmQ+dGhpcy5MZyYmIXRoaXMuTWcmJih0aGlzLk1nPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5MZywhMCkpO2E9bmV3IE1hKGEsYixkKTtmJiYoYS5oaT0hMCk7YyYmZS5GcigpJiYoYS54Zz0hMCk7ZyYmKGEuTGg9ITApO3JldHVybiBhLmxvYWQoKX0sRW86ZnVuY3Rpb24oKXtlLlNhKCl8fGUuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmthKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnBkKCl8fChhPXRoaXMudmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZWl9LEZvOmZ1bmN0aW9uKCl7dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkd2LmJpbmQodGhpcyksdGhpcy5Gdi5iaW5kKHRoaXMpKX0sR3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLk9wKCl9LEZ2OmZ1bmN0aW9uKCl7fSxPcDpmdW5jdGlvbigpe2UueWMoay5OcCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5rYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0saGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkliLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkliW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlphKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5pYSgpXT10aGlzO2UuWmEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5uZn0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEdiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0saGM6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEZoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsaCxjO2ZvcihoPTc7MDw9aDtoLS0pYz1hPj4+NCpoJjE1LGQrPWMudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGU9QXJyYXkoODApLGc9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHI9MzI4NTM3NzUyMCxuLHAsdSx0LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj0KYS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGYpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyllW2ZdPXdbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspZVtmXT1kKGVbZi0zXV5lW2YtOF1eZVtmLTE0XV5lW2YtMTZdLDEpO2M9ZztuPWs7cD1sO3U9bTt0PXI7Zm9yKGY9MDsxOT49ZjtmKyspdj1kKGMsNSkrKG4mcHx+biZ1KSt0K2VbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj00MDs1OT49ZjtmKyspdj1kKGMsNSkrKG4mcHxuJnV8cCZ1KSt0K2VbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NjA7Nzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2c9ZytjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7cj1yK3QmNDI5NDk2NzI5NX1yZXR1cm4oYihnKStiKGspK2IobCkrYihtKStiKHIpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5Kanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaXA9CnRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLlprPXRoaXMuYVsxMF07dGhpcy5vbz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs5XX1jLk5yPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLnBzKGEpfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXM6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlwOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ldDp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWms6dGhpcy5ubyhhKX0sbm86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgT2E9Yy5Ocnx8T2EsRGM9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkxxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5QP3RoaXMuJGE9YS5mLlAoKTp0aGlzLiRhPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnZkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuQmguYmluZCh0aGlzKSxtdXRlOnRoaXMuS2UuYmluZCh0aGlzKSx1bm11dGU6dGhpcy50di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVGI9dGhpcy5WYz0hMTt0aGlzLmZvPTFFMzt0aGlzLnBhPW51bGw7dGhpcy5MPWI7dGhpcy5OYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMucm89ZS5hYSgxMCk7dGhpcy5mZj0wO3RoaXMuVGM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5UYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJgooKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuVGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubm49ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5uaD10aGlzLkVkPSExO3RoaXMuZ2g9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLlpkPSExO3RoaXMuV2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5ZYj0hMTt0aGlzLlZvPWUuYWEoMTApO3RoaXMuRmI9ZS5hYSgxMCk7dGhpcy5EYj1lLmFhKDEwKTt0aGlzLkhoPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5qZT10aGlzLmNkPXRoaXMuaGY9dGhpcy5yYj10aGlzLmtjPXRoaXMucGg9dGhpcy5oZD10aGlzLmN2PXRoaXMudWI9dGhpcy5FYj0hMTt0aGlzLnBjPVtdOwp0aGlzLiRiPXt9O3RoaXMuaHQ9MjAwO3RoaXMueGY9dGhpcy55Zj10aGlzLmVlPXRoaXMud2Y9dGhpcy5VZT0hMTt0aGlzLnVkPXt9fWMuRGo9YjtiLnByb3RvdHlwZT17aHU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy4kYV0mJnRoaXMuY29uZlt0aGlzLiRhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuJGFdW2FdKTtyZXR1cm4gYn0sVWg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuWGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLkdkKCJjYWxsIix0aGlzLldhKCkpO2UudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEZlOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMudWI9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlkpdGhpcy5mZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLAp0aGlzLkwuR28oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlJhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlVoKCksbmV3IFModGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuVWgoKSxuZXcgUyh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKToKdGhpcy5QYSgpO2Vsc2V7dmFyIHNjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3NjLkZlKGEsYixkKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7YS5YYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5oZD0hMTt0aGlzLmM9YTt0aGlzLnR1KHRoaXMuYyk7dGhpcy51ZD1uZXcgUGEodGhpcy5jLkl2LHRoaXMudmlkZW8se30pO3RoaXMuSGcoYSk7dGhpcy5wYz10aGlzLnpnKGEpO3RoaXMuUW8oKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5FcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ucShhKSkpOwpyZXR1cm4gY30sbnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LEVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0KMDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlhhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZWQmJmEuZWQuZXJyb3ImJmEuZWQuZXJyb3IuY29kZSYmKGI9YS5lZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk5jLmNvZGU6Yj09Ri5SZC5jb2RlP2UudihrLmR3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSwKdGhpcy5CKCksdGhpcy5DKCkpOihlLkdlKCksYj09Ri5GZi5jb2RlJiZlLnYoay55cyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay5NcCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuR2QoImVtcHR5Iix0aGlzLldhKCkpO3RoaXMuVWEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5HZi5jb2RlOmUudihrLm93LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuc3csdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudihrLnpzLHRoaXMuYy5BLAp0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay5Edix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuemYuY29kZTplLnYoay5Fdix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5VYihhKTt0aGlzLlBhKCl9LFViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgYz1hLk5hLnBvcCgpO3RoaXMuRWUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHR1OmZ1bmN0aW9uKGEpe3RoaXMuamU9ITE7dGhpcy5OYj10aGlzLmIuSzsKdmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuTmIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlVlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXg9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTsKdGhpcy5ubiYmdGhpcy5wbGF5ZXIucGUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnBlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5obihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuVWUmJmIubG9hZCgpO2lmKHRoaXMuUWgoYikpe3RoaXMuR2QoInNldHVwIix0aGlzLldhKCkpO3RoaXMubG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlVlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPQp0aGlzLnBhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUm8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5wYS5hcHBlbmRDaGlsZChiKSx0aGlzLnJ1KCkpOnRoaXMuYy5vcmlnaW4ucWcody5RZCl9LHJ1OmZ1bmN0aW9uKCl7dGhpcy53Zj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmI9ITApO2UuaWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJmUubW4odGhpcy5jLm9yaWdpbi5zYSk7CmUuZmIoInNldFVwVnBhaWQiKTt0aGlzLkdkKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnFoKCk7dGhpcy5iLmRmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5kZigpO3RoaXMucGE9dGhpcy5OYj10aGlzLmIuSzt0aGlzLmFpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5KYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuSHEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmFlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLldiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnBjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuU3YoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5UdigpLHRoaXMuYi5XYighMCksIXRoaXMuTWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuTWI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkFlKHRoaXMuTWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5XYighMCksdGhpcy5YdigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuV2IoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWnYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuJHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5idygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5TYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5oZyx0aGlzLmMuQSwKdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLldjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy55ZiYmKHRoaXMueGY9ITEsdGhpcy5iYygpKSx0aGlzLlZ2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnJiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5KYigibXV0ZWQiLCJ1c2VyIiksZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkpiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnBmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLllkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLmFlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5YZihmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5XZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5rYz0hMH0sVnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMua2M9ITF9LFh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sCld2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlNmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZmIoImltcHJlc3Npb24iKTt0aGlzLkloKCk7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZmIoInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxadjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmhkPSEwO2UuZmIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sJHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpOwplLmZiKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5mYigidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMuc2YoKTtlLmZiKCJjb21wbGV0ZSIpO3RoaXMuVmEoImNvbXBsZXRlIil9LGZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZmIoImFkc3RvcHBlZCIpO3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuaWUoKTsKdGhpcy5IPSExO3RoaXMuUGEoYSl9fSxTdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLmZiKCJlcnIiLGIpO2UudihrLmN3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5maSghMCl9LGhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuUmEmJmIuaXNFbmFibGVkJiYhYi5wZCgpKXt2YXIgZD1iLnZhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsCnRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuTnYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxRaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sbG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuYmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxiaTpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGJ8fHRoaXMudWYoYSl9LmJpbmQodGhpcyksdGhpcy5mbykpfSx1ZjpmdW5jdGlvbihhKXtpZighdGhpcy5WYyYmdGhpcy5RaCh0aGlzLnZpZGVvKSYmIXRoaXMuRWImJiF0aGlzLlRiKXt0aGlzLlZjPSEwO3RyeXtpZighZS5TYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRWJ8fCh0aGlzLkViPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMuS3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5kZigpO3RoaXMuSnYoKTt0aGlzLmFpKCk7dGhpcy5hZygpO3RoaXMuYi5xaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5nZigpfX0sZ2Y6ZnVuY3Rpb24oKXt0aGlzLmNkfHx0aGlzLk1mKCl9LE1mOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuY2R8fChhP3RoaXMuUGEoKToodGhpcy5LZSghMCksdGhpcy5NZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmFjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0uYmluZCh0aGlzKTt0aGlzLnJlKCkuRWgodGhpcyl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5FYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLmNuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5QYSgpfSxQYTpmdW5jdGlvbihhKXtpZighdGhpcy5qZSlpZih0aGlzLmplPQohMCx0aGlzLk5kfHwoZS52KGsuQnMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5uYyl7ZS5vYigibmV3U21hbGxBZElkIik7dGhpcy5mZisrO3RoaXMuVGI9dGhpcy5WYz0hMTt0cnl7dGhpcy5BZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLk5iLnJlbW92ZUNoaWxkKHRoaXMucGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5ZaCgpfWNhdGNoKGcpe310aGlzLmhmPSEwO3RoaXMuYi52ZSgpO3RoaXMuWWI9ITE7dGhpcy5yZSgpLnpoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLkxlKCk7dGhpcy5jLm5jJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5rZSgpKX1lbHNlIHRoaXMua2UoKX0sTnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7CnRoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50ZihhKSl9LHRmOmZ1bmN0aW9uKGEpe3RoaXMuVGI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLkVvKCk7dGhpcy5jLm9yaWdpbi5xZyh3LlFkKX0sY2k6ZnVuY3Rpb24oKXtpZih0aGlzLmN2KXRoaXMuUGEoKTtlbHNle3RoaXMuWWI9ITA7dGhpcy5iLmYuSmEmJiF0aGlzLmhmJiZ0aGlzLmIuZi5KYSgpJiZlLnYoay5hZCx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5mdihhKTtpZighdGhpcy5NYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmCih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5NYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuQWUodGhpcy5NYil9Yz0iIjt0aGlzLmMuZWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGgpKSYmKGM9dGhpcy5jLmVmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSwKdGhpcy5FZHx8KHRoaXMuRWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMudGI/KHRoaXMuVGI9dGhpcy5WYz0hMSx0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5OYi5yZW1vdmVDaGlsZCh0aGlzLnBhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLlloKCksdGhpcy5jLm9yaWdpbi5MZSgpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlRjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlpkPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxWaDpmdW5jdGlvbigpe3RoaXMucGh8fAoodGhpcy5waD0hMCx0aGlzLmhkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sZnY6ZnVuY3Rpb24oYSl7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLldofHx0aGlzLkVifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuVmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZoKCl9LmJpbmQodGhpcykpLHRoaXMuRWJ8fHRoaXMuSWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5WYSgic3RhcnQiKSxlLnYoay5PZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksCnRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5qYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmhkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5RZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLAoidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuV2g9YSl9LEdkOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxJaDpmdW5jdGlvbigpe2UudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLHRoaXMuV2EoKSwhMCl9LFVhOmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX2hkX2FkX2Vycm9yIixhLCEwKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMud2Z8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxKYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkViKXt0aGlzLnVkJiZ0aGlzLnVkLnRyYWNrJiZ0aGlzLnVkLnRyYWNrKGEpOwppZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5GcSh0aGlzLmMuTmEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRHIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5FZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZG4sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKGcudXJsLApnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuY3AodGhpcy5jLk5hLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWUuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLndmJiYoYj0iX3ZwYWlkIik7dGhpcy55ZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxFZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC54YShhKSxjJiZiLmduKGMpLGZ8fChmPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuam4oYSksdGhpcy5MLklhKGIsZnVuY3Rpb24oKXt0aGlzLnloKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGpuOmZ1bmN0aW9uKGEpe3RoaXMuJGJbYV09Im9wZW4ifSx5aDpmdW5jdGlvbihhKXt0aGlzLiRiW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuJGI9e319LEZ1OmZ1bmN0aW9uKCl7dmFyIGE9CjAsYjtmb3IoYiBpbiB0aGlzLiRiKXRoaXMuJGIuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy4kYltiXSYmYSsrO3JldHVybiBhfSxGcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGNwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEt2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mdi5iaW5kKHRoaXMpKX0sTHY6ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmJjKCk6dGhpcy5jLlNiJiYoZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KIl90b3AiO3RoaXMuTC5XYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5TYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuU2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxKdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLAphLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5UYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5YYyYmKGI9dGhpcy5MLlhjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnBhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJgp0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxhaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuVm87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuRmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5TaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuYmMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkRiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ldi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5kdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkhoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmVmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXToKKGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLnBhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5YZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi5xYSYmdGhpcy5iLmYucWEoKSYmKGUudihrLmlnLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5LZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGJjOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLnhmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuUmMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxTaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMua2M/KGUubGEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuSmIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwidXNlciIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMucmI/KGUubGEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sS2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwiY29udGVudCIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx0djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5KYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LGFjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmFjKTt0aGlzLmNkfHx0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0sa2U6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuZmQoKTshdGhpcy5MLmpjfHxlLlNhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5lZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5uaD8odGhpcy5jZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLmpnKCkpOih0aGlzLm5oPXRoaXMueWY9dGhpcy54Zj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKSx0aGlzLmVlPSEwLGE9ZS4kZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5GZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5GdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLHRoaXMuaHQpOih0aGlzLmhmPSEwLHRoaXMuYi52ZSgpLHRoaXMuYi5ZdCgpLHRoaXMuWWI9ITEsZS52KGsuVW8sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnJlKCkuemgoKSl9LHJlOmZ1bmN0aW9uKCl7dmFyIGE9Cm51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxhZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLnplKHRoaXMudmlkZW8sYSk/dGhpcy5CaCgpOnRoaXMudmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5TYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnBjJiYwPHRoaXMucGMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnBjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT0Ke307YS5hZHNlc3Npb25faWQ9dGhpcy5ybysiLSIrdGhpcy5mZjt0aGlzLmMmJnRoaXMuYy5EZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuRGcoKSk7cmV0dXJuIGF9LG9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5Eanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXY9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzZdO3RoaXMuY2w9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5WcT1iO2IucHJvdG90eXBlPXt4djpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXY6dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNpOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuVnF8fApSYSxFYz1uZXcgUmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy54dig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkNhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMub2M9dGhpcy5xYz0hMTt0aGlzLnNhPSIiO3RoaXMudmY9ITE7ZCYmZC5lbXB0eT90aGlzLmJzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuZmQoKSxiO2I9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7CmMmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOmwueGEobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLmxnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT0KY3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC54YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnhhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5hcy5iaW5kKHRoaXMpLHRoaXMuWXIuYmluZCh0aGlzKSl9LApBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5DYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuWGIpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7CnZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuQ2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLlhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5YYnx8dGhpcy5JcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5LdSgpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrCiciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtmW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxJcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmCmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGFzOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMuQ2E9YS5yZXNwb25zZVhNTCx0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuU2QpKX10aGlzLlg9dGhpcy5BZygpO3RoaXMucWM9dGhpcy5sZigpO3RoaXMub2M9dGhpcy5OaCgpOwp0aGlzLlgubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuUWEody5OYyx7ZXJyb3I6dGhpcy52Zj9GLlJkOkYuRWZ9KSl9LGJzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUWEody5TZCkpfXRoaXMuWD10aGlzLkFnKCk7dGhpcy5xYz10aGlzLmxmKCk7dGhpcy5vYz10aGlzLk5oKCk7dGhpcy5YLmxlbmd0aD90aGlzLkdjKCk6dGhpcy5vYSh0aGlzLlFhKHcuTmMse2Vycm9yOnRoaXMudmY/Ri5SZDpGLkVmfSkpfSxZcjpmdW5jdGlvbigpe3RoaXMub2EodGhpcy5RYSh3LkRmLHtkZXB0aDphfSkpfSxHYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLktyKCk/dGhpcy5VdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLklnKCksaCx7QWRTeXN0ZW06dGhpcy5tcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5vYSh0aGlzLlFhKHcuR2YpKTooYT0wLHRoaXMuQnYoKSYmdGhpcy5RZSh0aGlzLldvKCkpKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkdjKCkpOnRoaXMucGFyZW50LkxlKCl9LGtoOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5raCgpfSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ1KCk/dGhpcy5RdSgpPyEwOigtMSE9dGhpcy56YygpP3RoaXMub2EodGhpcy5RYSh3LlBkKSk6dGhpcy5vYSh0aGlzLlFhKHcuemYpKSwhMSk6KHRoaXMub2EodGhpcy5RYSh3Lk5jLEYuRmYpKSwhMSl9LFFlOmZ1bmN0aW9uKGEpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLk5hPWEuTmEuY29uY2F0KHRoaXMuSGUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWGE9CmEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuUWUoYSl9LFdvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLmR1cmF0aW9uPXRoaXMuemMoKTthLk89dGhpcy5GZygpO2EuU2I9dGhpcy5vcSgpO2EuSXY9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5scSgpO2EuZWY9dGhpcy5EcShhLmR1cmF0aW9uKTthLlhhPWEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLlhhPWIuWGE/Yi5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5OYT1iLmVycm9yLmNvZGUhPXcuUGQuY29kZT9iLk5hLmNvbmNhdCh0aGlzLnBxKCkpOmIuTmEuY29uY2F0KHRoaXMueXEoKSkpOwp0aGlzLlgubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5VYiYmdGhpcy5wYXJlbnQuVWIoYiksYT0wLHRoaXMuR2MoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxVYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5VYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUWEoYSxiKSl9LFFhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxSdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy56YygpfSxsZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxOaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMubGYoKSYmKGE9ITApO3JldHVybiBhfSxKdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMudmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sS3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LG1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxIZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0KIkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0seXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sCnBxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxvcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxPdzphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD0KYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5sZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxEcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkN1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubGQoYSk6IiJ9LGxkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9rPXRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVsxMF07dGhpcy5Qbz10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLlRwPWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMub2s6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhrOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qbzp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLlRwfHxVYSxGYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5uayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk5hPVtdO3RoaXMuTz1bXTt0aGlzLlNiPSIiO3RoaXMuQT10aGlzLm5jPXRoaXMudGI9ITE7dGhpcy53ZT10aGlzLm9yaWdpbj1udWxsO3RoaXMueGU9IiJ9Yy5NbD1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx3cTpmdW5jdGlvbigpe2lmKCF0aGlzLndlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkNhKXt2YXIgYT10aGlzLm9yaWdpbi5DYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLndlPWFbY10pfXJldHVybiB0aGlzLndlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueGUpcmV0dXJuIHRoaXMueGU7dmFyIGE9IiI7KGE9dGhpcy53cSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMueGU9YX0sSHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLk1sfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUG49dGhpcy5hWzZdO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuYXI9dGhpcy5hWzVdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5maj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUG46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkpwOnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hcjp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLmZqfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Obig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsCk1hOiJYTUxfUEFSU0VfRVJST1IifSx6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTWE6IkRVUkFUSU9OX0VSUk9SIn0sTmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE1hOiJFTVBUWV9WQVNUIn0sR2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTWE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LERmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsCm1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixNYToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixNYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEZ3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLApNYToiTUVESUFGSUxFX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTWE6IkRVTU1ZX0FEIn19LEY9e0VmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTWE6Ik5PX0FEUyJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixNYToiTk9fTUVESUFGSUxFUyJ9LEd3Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE1hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTWE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19CmMuVmo9YjtiLnByb3RvdHlwZT17bnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Wanx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMubnMoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5lZD1iO3RoaXMuTmE9W107dGhpcy5vcmlnaW49bnVsbH1jLmtqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5ranx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3E9dGhpcy5hWzVdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMuZmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19CmMudnA9YjtiLnByb3RvdHlwZT17anE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54aTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLnZwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5qcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuQWg9YTt0aGlzLnZpZGVvPWI7dGhpcy5MZD1bXTt0aGlzLnhoPVtdO3RoaXMuTWU9W107dGhpcy5Ndj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLlBrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuQWgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5BaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBnPWUuY29udGVudFdpbmRvdztnLml4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlZ0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLk90LmJpbmQodGhpcyl9O3ZhciBrPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwprLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztnLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7Zy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspO3RoaXMuTGQucHVzaCh7c3JjOmMsZnJhbWU6ZSxtdDpmLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5NZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLk1lW2JdO2MudHlwZT09PWEmJmMueW8odGhpcy5xcShhKSl9fSxxcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntyeDohMCxxeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntleDoidmlkZW8iLHR4OiJqc0N1c3RvbSIsdXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsdng6MSxQdzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEdxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5MZC5sZW5ndGg7YisrKWlmKHRoaXMuTGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5MZFtiXS5tdDtyZXR1cm4iIn0sVnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLkdxKGIpLHZlbmRvcjpifSk7CnRoaXMuRHUoKX0sT3Q6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk12Lm1hcChmdW5jdGlvbihhKXt0aGlzLllmKGEsYil9LmJpbmQodGhpcykpOnRoaXMuWWYoYSxiKX0sWWY6ZnVuY3Rpb24oYSxiKXt0aGlzLk1lLnB1c2goe3R5cGU6YSx5bzpiLG94OiExfSl9LER1OmZ1bmN0aW9uKCl7dGhpcy54aC5tYXAoZnVuY3Rpb24oYSl7YS5Hcnx8KGEuaHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Hcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUGE9Yy5Qa3x8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXM9dGhpcy5hWzNdO3RoaXMudnY9dGhpcy5hWzEwXTt0aGlzLiRvPQp0aGlzLmFbOV07dGhpcy5xbj10aGlzLmFbMV07dGhpcy5Xbj10aGlzLmFbM107dGhpcy5Ibj10aGlzLmFbMV07dGhpcy5hbD10aGlzLmFbOV07dGhpcy5rcD10aGlzLmFbOF07dGhpcy5qdD10aGlzLmFbNV07dGhpcy5Qaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs2XX1jLktrPWI7Yi5wcm90b3R5cGU9e2xzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tczp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnY6dGhpcy5abyhhKX0sWm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRvOnRoaXMucG4oYSl9LHBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xbjp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV246dGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhuOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hbDp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmtwOnRoaXMuaXQoYSl9LGl0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qdDp0aGlzLk9qKGEpfSxPajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLktrfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5scyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmliPWEuQmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5SYj1bXX1jLlZpPWI7Yi5wcm90b3R5cGU9e2dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuZ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6Cihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxJdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFloOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSwKcWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5hZCx0aGlzLmYucygpKX0sWXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5iZCx0aGlzLmYucygpKSl9LGRmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmliLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5JYyYmdGhpcy5mLkljKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPQpiLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWnAodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy52ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSWMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsKInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5SYi5sZW5ndGg7YSsrKXRoaXMuUmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5KaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLldiLmJpbmQodGhpcyksMTApfSxYZjpmdW5jdGlvbihhKXt0aGlzLlJifHwodGhpcy5SYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuUmIucHVzaChhKX0sdmU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5WaXx8WmEsQz1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzddO3RoaXMuRWs9dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzhdO3RoaXMuWWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5Jbj1iO2IucHJvdG90eXBlPXtndjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5odjp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3M6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVrOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGw6dGhpcy5YaShhKX0sWGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgYWI9Yy5Jbnx8YWIsS2M9bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZ3YoNCk7KGZ1bmN0aW9uKGMpe2MuQWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5CZChiKTt0aGlzLm1nKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx5ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYmI9Yy5BbHx8YmI7KGZ1bmN0aW9uKGMpe2Muemw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuUWI9dGhpcy5RYnx8ITE7dGhpcy5QZj10aGlzLlJmPXRoaXMuUmc9dGhpcy5lYT10aGlzLm9mPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuVnAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm9mPSEwO3RoaXMuUmcmJnRoaXMuZ2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuWWMoKTsKdGhpcy5SZz0hMDt0aGlzLmdnKCl9LmJpbmQodGhpcykpO3RoaXMuY2coKX0sZ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5ZYygpO2lmKCF0aGlzLm9mJiYhdGhpcy5ZYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMub2YmJnRoaXMuUGYmJiF0aGlzLlJmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0sWWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApjZzpmdW5jdGlvbigpe2lmKHRoaXMuWWMoKSl7dmFyIGI9dGhpcy5HZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuUGY9Yi5Nd310aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN4KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSx6cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxWcDpmdW5jdGlvbihiLGEpe3RoaXMuUWI9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRjKCl9LmJpbmQodGhpcyksMTAwKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi55ZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLnpxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuemx8fGNiOyhmdW5jdGlvbihjKXtjLkJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkhyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlNsLiRtLlltP3dpbmRvdy5PTy5TbC4kbS5ZbS5LdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnNlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBiYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgY2IoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuVms9dGhpcy5hWzZdO3RoaXMuZXM9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzNdO3RoaXMudHQ9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMua209YjtiLnByb3RvdHlwZT17VWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZrOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lczp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXA6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmI9Yy5rbXx8ZmIsTGM9bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuVWsoNCk7KGZ1bmN0aW9uKGMpe2MuSGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5KZygpfSxKZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVihiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy50aCgpfSx0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuSGl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOwoxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy50YSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnRhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmRnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBoYj1jLkdpfHxoYjsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LHdoOmZ1bmN0aW9uKGIpe2I9bmV3IGdiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaGIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XcHx8KHRoaXMuV3A9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLndoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBpYj1jLklpfHxpYixUPW5ldyBpYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs4XX1jLnZ3PWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYj1jLnZ3fHxqYixNYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5mcig0KTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxJYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuZG18fFU7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuU2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlNjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTXMoYSl9LmJpbmQodGhpcykpO3kuU2MoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5TYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuTnEoKX0sTXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLmNtfHxWOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy50ZCYmKGI9ZS5mcChiLHRoaXMudGQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnRkfHwodGhpcy50ZD1bXSksdGhpcy50ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sU2M6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFZ1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuRmN8fCh0aGlzLkZjPVtdKSx0aGlzLkZjLnB1c2goYiksdGhpcy5YdCgpJiYodGhpcy5YZSgpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxOcTpmdW5jdGlvbigpe2lmKHRoaXMuRmMpZm9yKHZhciBiPTA7Yjx0aGlzLkZjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuRmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5WdShiKX19KX0pKGMpO3ZhciBrYj1jLmVtfHxrYix5PW5ldyBrYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlxPXRoaXMuYVsxMF07dGhpcy5Ncj10aGlzLmFbNF07dGhpcy5ibT10aGlzLmFbMl07dGhpcy55cD10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbM107dGhpcy5Cbj10aGlzLmFbMTBdO3RoaXMuJG49CnRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzJdfWMudm89YjtiLnByb3RvdHlwZT17aHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYm06dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlwOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zczp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm46dGhpcy5abihhKX0sWm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy4kbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYj1jLnZvfHxsYixOYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaHEoNCk7KGZ1bmN0aW9uKGMpe2MuRGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxKYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLkRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5FaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5FaXx8bmI7KGZ1bmN0aW9uKGMpe2MuRmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgbWIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgbmIoZSx0aGlzLkkpKS5nKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5GaXx8b2IscGI9bmV3IG9iKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJsPXRoaXMuYVszXTt0aGlzLm1yPXRoaXMuYVsyXTt0aGlzLnhqPXRoaXMuYVsxXTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs5XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLkZzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLnd2PWI7Yi5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuUmw6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1yOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXE6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkpzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWI9Yy53dnx8cWIsT2M9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUWwoNCk7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5WKGIpO3RoaXMuWihhKTt0aGlzLk50KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMub2x8fHJiOyhmdW5jdGlvbihjKXtjLm5sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpO3RoaXMuZ2k9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZ2kmJih0aGlzLkcoKSx0aGlzLmdpPSEwLHRoaXMucmEoKSk7YS5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgc2I9Yy5ubHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyByYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBzYihjLAp0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHRiPWMucGx8fHRiLFc9bmV3IHRiKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmh3PXRoaXMuYVsyXTt0aGlzLlB2PXRoaXMuYVs0XTt0aGlzLnhyPXRoaXMuYVs0XTt0aGlzLm1qPXRoaXMuYVs5XTt0aGlzLlByPXRoaXMuYVsxXTt0aGlzLmZ1PXRoaXMuYVs2XTt0aGlzLlJrPXRoaXMuYVs3XTt0aGlzLlNwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuWnU9YjtiLnByb3RvdHlwZT17Z3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh3OnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qdjp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHI6dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1qOgp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ1OnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sazp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB1Yj1jLlp1fHx1YixQYz1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5ndyg0KTsoZnVuY3Rpb24oYyl7Yy5KbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxMYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy5KbXx8dmI7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEx0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9W10pO3RoaXMuYWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnRhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnlhP3RoaXMuTHQodGhpcy55YSk6KHRoaXMueWE9dGhpcy5WYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnlhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMucmMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuYWImJnRoaXMuYWIubGVuZ3RoJiYxPHRoaXMuYWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5hYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuYWJbYV0mJjMwMyE9dGhpcy5hYlthXSYmNDAzIT10aGlzLmFiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy50YSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5JbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB2YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHdiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB4Yj1jLkttfHwKeGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVs1XTt0aGlzLnZuPXRoaXMuYVs3XTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnV3PXRoaXMuYVsxXTt0aGlzLlJuPXRoaXMuYVs1XTt0aGlzLkl0PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuQ209YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFwOnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYXQ6dGhpcy50dyhhKX0sdHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51dzp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm46dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkl0Ogp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHpiPWMuQ218fHpiLFFjPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLlBwKDQpOyhmdW5jdGlvbihjKXtjLlhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlJlPSExfSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy54dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHh0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlJlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlJlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEV1OmZ1bmN0aW9uKCl7dGhpcy5SZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuWGx8fEFiOyhmdW5jdGlvbihjKXtjLldsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5pYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ocz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5ocz8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuV2x8fEJiOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBCYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIENiPWMuWWx8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdj10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNF07dGhpcy5Mcz10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbN107dGhpcy5Daz10aGlzLmFbM107dGhpcy5icD10aGlzLmFbMV07dGhpcy5udj10aGlzLmFbMl07dGhpcy5Zbz10aGlzLmFbN107dGhpcy5Scj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLmptPWI7Yi5wcm90b3R5cGU9CntrdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubHY6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVyOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mczp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNrOnRoaXMuYXAoYSl9LGFwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5icDp0aGlzLm12KGEpfSxtdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnY6dGhpcy5YbyhhKX0sWG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllvOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBFYj1jLmptfHxFYixSYz1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5VbHx8RmI7KGZ1bmN0aW9uKGMpe2MuVGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5TbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmtkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5XcigpOnRoaXMuZmcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxTbzpmdW5jdGlvbigpe3RoaXMuTmYoKXx8dGhpcy5tKCEwKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtkKCk7IWIubmEmJmIuWCYmYi5KdyYmYi5MdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMua2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sa2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5vaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMub2g9YltjXSk7cmV0dXJuIHRoaXMub2h9LApkeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5rZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBGYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEdiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEhiPWMuVmx8fEhiLEliPW5ldyBIYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdj10aGlzLmFbM107dGhpcy5taz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxMF19Yy5XaT1iO2IucHJvdG90eXBlPXtwdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXY6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgSmI9Yy5XaXx8SmIsU2M9bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ClNjLnB2KDQpOyhmdW5jdGlvbihjKXtjLklrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sYng6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxKYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPQpjLklrfHxYOyhmdW5jdGlvbihjKXtjLkhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlNlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuU2U9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5TZSYmYiE9dGhpcy5TZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLnphKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS5qeCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmCih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhrfHxZOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5YZSgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxLYj1jLkprfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV0PXRoaXMuYVs2XTt0aGlzLlJqPXRoaXMuYVs2XTt0aGlzLmNqPXRoaXMuYVs2XTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbMl07dGhpcy5xcj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5mcz1iO2IucHJvdG90eXBlPXtEdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXQ6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Sajp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY2o6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmp2OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Uazp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTW46dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTWI9Yy5mc3x8TWIsVGM9bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuRHQoNCk7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGd4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuemp8fE5iOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5PbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIE9iPWMueWp8fE9iOyhmdW5jdGlvbihjKXtjLkFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE5iKGJbYV0pO2MubWF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IE9iKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTsKdmFyIFBiPWMuQWp8fFBiLFFiPW5ldyBQYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ZcD10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbN107dGhpcy5UbT10aGlzLmFbNF07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Ddz10aGlzLmFbNV07dGhpcy5TcT10aGlzLmFbMl07dGhpcy5Vcz10aGlzLmFbMTBdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtYcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlFzOnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5UbTp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmk6dGhpcy5CdyhhKX0sQnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/CnRoaXMuQ3c6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNxOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Vczp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmI9Yy5zanx8UmIsVWM9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuWHAoNCk7KGZ1bmN0aW9uKGMpe2MuUW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT0KYS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlYoYSl9ZWxzZSB0aGlzLmNhKCl9LE10OmZ1bmN0aW9uKCl7dGhpcy5PZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuT2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk9kfHwodGhpcy5PZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LApKYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFNiPWMuUW18fFNiOyhmdW5jdGlvbihjKXtjLlBtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFF0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMudmMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy52YyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLnZjKGEpfS5iaW5kKHRoaXMpKX0sdmM6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LEpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy52Yyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5RdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLkpmKCk7dGhpcy5QdCgpfSxQdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsZnVuY3Rpb24oYil7dGhpcy52YyhiKX0uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuS3Q9ITB9fSl9KShjKTt2YXIgVGI9Yy5QbXx8VGI7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFRiKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFViPWMuUm18fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3Y9dGhpcy5hWzVdO3RoaXMua3I9dGhpcy5hWzldO3RoaXMuRm49dGhpcy5hWzhdO3RoaXMua2s9CnRoaXMuYVs4XTt0aGlzLkJpPXRoaXMuYVs2XTt0aGlzLlh1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVs3XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmZxPWI7Yi5wcm90b3R5cGU9e3J2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zdjp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3I6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZuOnRoaXMuamsoYSl9LGprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5razp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQmk6dGhpcy5XdShhKX0sV3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlh1OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdDp0aGlzLk1tKGEpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5mcXx8V2IsVmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMucnYoNCk7KGZ1bmN0aW9uKGMpe2MudW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5yaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LApQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucmgmJih0aGlzLnJoPSEwLHRoaXMuVyYmdGhpcy5XKCkpfX0pfSkoYyk7dmFyIE89Yy51bXx8TzsoZnVuY3Rpb24oYyl7Yy50bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy5DYnx8KHRoaXMuQ2I9MCksdGhpcy5DYisrLDE1PHRoaXMuQ2Ipe2lmKHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnlhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnRtfHxQOyhmdW5jdGlvbihjKXtjLnZtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLlRhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj0KbmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuWGUoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBYYj1jLnZtfHwKWGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV3PXRoaXMuYVsxMF07dGhpcy54bz10aGlzLmFbM107dGhpcy5VaT10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbM107dGhpcy5sbD10aGlzLmFbMV07dGhpcy51cj10aGlzLmFbOV07dGhpcy5MbD10aGlzLmFbNl07dGhpcy56bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLll1PWI7Yi5wcm90b3R5cGU9e0R3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG86dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zcDp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGw6dGhpcy50cihhKX0sCnRyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy55bShhKX0seW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgWmI9Yy5ZdXx8WmIsV2M9bmV3IFpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9V2MuRHcoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSk7YSYmdGhpcy5WKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5xa3x8WjsoZnVuY3Rpb24oYyl7Yy5waz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkRjPXRoaXMueWE9dGhpcy5VYz0hMTt0aGlzLnZoPWUuR2IoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9CmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuT2crKztpZigxMDx0aGlzLk9nKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fAotMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTsKYnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy50YSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLnBrfHxhYTsoZnVuY3Rpb24oYyl7Yy5yaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9CjA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciAkYj1jLnJrfHwkYixhYz1uZXcgJGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzFdO3RoaXMudms9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdO3RoaXMuZ3Q9dGhpcy5hWzJdO3RoaXMuR3A9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMl19Yy53cD1iO2IucHJvdG90eXBlPQp7cG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFvOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52azp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHM6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmd0OnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJjPWMud3B8fGJjLFhjPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLnBvKDQpOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLAphPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLnVqfHxjYzsoZnVuY3Rpb24oYyl7Yy50aj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMudGp8fApkYzsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubWEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBkYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGVjPWMudmp8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbD10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbMl07dGhpcy5ibz10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbNV07CnRoaXMuQm09dGhpcy5hWzNdO3RoaXMueG49dGhpcy5hWzRdO3RoaXMuTWs9dGhpcy5hWzhdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMucXA9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5Vaj1iO2IucHJvdG90eXBlPXtHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5JcShhKX0sSXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpxOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm86dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG46dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1rOnRoaXMuTWooYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Oajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLnFwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgZ2M9Yy5Vanx8Z2MsWWM9bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuR2woNCk7KGZ1bmN0aW9uKGMpe2Muamk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5WKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBoYz1jLmppfHxoYzsoZnVuY3Rpb24oYyl7Yy5paT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLAoxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgaWM9Yy5paXx8aWM7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxZYTpmdW5jdGlvbihiKXtiPW5ldyBoYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGljKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLllhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5ZYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYz1jLmtpfHxqYyxrYz1uZXcgamMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ1PXRoaXMuYVsyXTt0aGlzLnJsPXRoaXMuYVs4XTt0aGlzLlpqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMucnc9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5idTp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucmw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgbGM9Yy5yd3x8bGMsWmM9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuYXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9CnRoaXMuYWg9dGhpcy4kZz0hMTt0aGlzLndkPVtdO3RoaXMuV2U9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBZYj9udWxsOlliLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuT2w9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5BcShhKTpbXSxiO3RoaXMuYWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuJGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuQ2goYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLlpnKWJyZWFrOwpiPXRoaXMuV2VbY107dGhpcy5yZihiKSYmKHRoaXMud2QucHVzaChiKSx0aGlzLkNoKGIpKX19LHJmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5yZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxDaDpmdW5jdGlvbihhKXt0aGlzLnJmKGEpJiZhLmcoKX0sR3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHQmJiF0aGlzLiRnKWZvcih0aGlzLlpnPSEwLGE9MDthPHRoaXMud2QubGVuZ3RoO2ErKyl0aGlzLndkW2FdLktiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2RbYV0uS2IpfX19KShjKTt2YXIgbWM9Yy5PbHx8bWMsTT1uZXcgbWM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLlhqPXRoaXMuYVsxMF07dGhpcy5Pcz10aGlzLmFbNl07dGhpcy5HdD10aGlzLmFbMV07dGhpcy52dD10aGlzLmFbNV07dGhpcy5jcT10aGlzLmFbMTBdO3RoaXMuQ3A9dGhpcy5hWzEwXTt0aGlzLlhxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuWnM9YjtiLnByb3RvdHlwZT17S286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxvOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yajp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3M6dGhpcy5GdChhKX0sRnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HdDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNxOnRoaXMuQnAoYSl9LEJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ3A6dGhpcy5XcShhKX0sCldxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYz1jLlpzfHxuYywkYz1uZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5Lbyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueWMoay5DdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueWMoay5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBhZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHFjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS55cigpLHtpZDpiZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuTm89dGhpcy5hWzZdO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsxXTt0aGlzLm90PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVs2XTt0aGlzLkRzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTG09YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhtOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMud3M6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmRrOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTm86dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5obDp0aGlzLktqKGEpfSxLajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGo6dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm90OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Hazp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWGs6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5MbXx8b2MsY2Q9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLldtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zaD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMucmQ9MDt0aGlzLiRhPSIiO3RoaXMueGQ9W107dGhpcy55ZD0wO3RoaXMudWg9ITE7dGhpcy5UZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5saT1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLnNoPWF9LGJmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxpdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy4kYV1bYV0pOwpyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oYSxiKXtlLnphKCJ3ZWx0LmRlIikmJmUuWmEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy56cigpKXRoaXMubGIubCh0aGlzLmxiLm1kLHRoaXMubGIuRGEsdGhpcy5sYi5WZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLnhjKTtlbHNlIGlmKHRoaXMuUHEoKSl0aGlzLmN1KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmUudihrLmFkLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5JdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFFhKGwsdGhpcy5sYixnKTtsLmh1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5ncyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuRWgobCl9fSx6cjpmdW5jdGlvbigpe3ZhciBhPQpuZXcgRGF0ZSxiPTA7aWYodGhpcy5yZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnJkLmdldFRpbWUoKSx0aGlzLnJkPWEsM0U1PGI/ITA6ITE7dGhpcy5yZD1hO3JldHVybiExfSx6dTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmFmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5GYSgiYWRUYWciKTt0aGlzLkZhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5GYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMucmcoYSkpP3RoaXMuSmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX0seXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuYWYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLm91KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5yZyhjKSk/dGhpcy5KYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX19LHJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxUdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnN1KHRoaXMueXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTGEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuYWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuSmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuYmQsdGhpcy5wbGF5ZXIucygpKSl9fSxTdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm51KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSWUoKX0sZzpmdW5jdGlvbigpe3RoaXMuenUoKTt0aGlzLnBsYXllci5JZSYmdGhpcy5TdCgpO3RoaXMuVHQoKX0sVXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy54ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMud3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLAphW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy55ZD10aGlzLnhkLmxlbmd0aH0sUHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMueWQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy51aD1hO2ZvcihhPTA7YTx0aGlzLnhkLmxlbmd0aDthKyspdGhpcy54ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkJ0LmJpbmQodGhpcykpfSxCdDpmdW5jdGlvbihhKXt0aGlzLnlkLS07YSYmdGhpcy5UZS5wdXNoKGEpOzA+PXRoaXMueWQmJnRoaXMudWgoKX0sZ3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVGUubGVuZ3RoO2MrKyliPXRoaXMuVGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMubGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm9pPXRoaXMuYVs2XTt0aGlzLlZyPXRoaXMuYVsxMF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubnc9dGhpcy5hWzVdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMua3c9dGhpcy5hWzFdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMub209dGhpcy5hWzFdO3RoaXMudXM9dGhpcy5hWzhdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5ycz1iO2IucHJvdG90eXBlPXtuaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2k6dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZyOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qajp0aGlzLmx3KGEpfSxsdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnc6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF2OnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5rdzp0aGlzLnh3KGEpfSx4dzpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnl3OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vbTp0aGlzLnRzKGEpfSx0czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXM6dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5yc3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQubmkoNCl9KS5jYWxsKGNlaVF1YWVmaGFpQnV4YWUsY2VpUXVhZWZoYWlCdXhhZSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.244.75
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.75.244.243.136.clients.your-server.de
- Software
-
TornadoServer/5.0 /
- Resource Hash
- 9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
|
POST
H/1.1
|
200
OK
|
/
Show response
ssl.3.damoh.giga.de/7fefeed85718445da26e569dd95de64ca410238c/
Frame 4650
|
42 B
875 B
|
152ms
71ms
|
XHR
image/gif |
136.243.244.75
HETZNER-AS
|
|
General
- Full URL
- https://ssl.3.damoh.giga.de/7fefeed85718445da26e569dd95de64ca410238c/
- Requested by
- Host: text
URL: data:text/javascript;base64,dmFyIGNlaVF1YWVmaGFpQnV4YWU9Y2VpUXVhZWZoYWlCdXhhZXx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBiYSgpe3kuT2V8fCh5Lk9lPTApO3kuT2UrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXkudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eS52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eS5PZSYmd2luZG93LnNldFRpbWVvdXQoYmEsNTAwKX1mdW5jdGlvbiBBKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsQSk7Y2E9ITA7Zm9yKHZhciBjPTA7YzxDLmxlbmd0aDtjKyspQ1tjXS5sb2FkKCk7CmZvcihjPTA7YzxDLmxlbmd0aDtjKyspe3ZhciBiPUNbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1LJiYoSygpLEs9ITEpfWZ1bmN0aW9uIGRhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZWEoKXtpZihtKXttLnBhdXNlQnV0dG9ufHwobS5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7Cm0ucGxheUJ1dHRvbnx8KG0ucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0ubXV0ZUJ1dHRvbnx8KG0ubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cm0udW5tdXRlQnV0dG9ufHwobS51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwptLnNraXBhYmxlQnV0dG9ufHwobS5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO20uc2tpcEJ1dHRvbnx8KG0uc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihtLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O20uc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYSl7dmFyIGI9YS5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7YT1hLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7ZS5aYShhLGIsW10sYyxjLGwpfSl9bC5sKG0uZ2xvYmFsQ29uZmlnLG0uY2xpZW50Q29uZmlnLG0ucHJlY2hlY2tlZCxtLm9uUmVhZHksbS5vbkZhaWx1cmUsbSk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGI9bS5zdGFydFBsYXllcjtiJiYiZnVuY3Rpb24iPT09dHlwZW9mIGImJmIoKX1lbHNlIHFjKGVhLDUwKX1mdW5jdGlvbiByKGMsYil7aWYoZS5zbyllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKG0mJmwpeyhtLmFkVGFnfHxtLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLnYoay5hZCxjLnMoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYSl9Yj9sLlJhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2E9bmV3IGZhO2EuYmYoYyk7YS5qdShsKTthLml1KG0pO2EuVXQoKTthLmcoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGIpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBnYShjLGIpe2MucGF1c2UoKTtpZihsLkliLmxlbmd0aCl7dmFyIGE9bC5JYi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1hLnR5cGUpe3ZhciBoO2g9ZS5wdSh7IltMT0FEU0NSSVBUXSI6ZS5hYSgxMCksIltVVElMU10iOmUuYWEoMTApLCJbQ0FMTEJBQ0tdIjplLmFhKDEwKX0pO3dpbmRvd1toWyJbTE9BRFNDUklQVF0iXV09ZS5maC5iaW5kKGUpO3dpbmRvd1toWyJbVVRJTFNdIl1dPWw7Zm9yKHdpbmRvd1toWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGEpe2Zvcih2YXIgaCBpbiBhKW1baF09YVtoXTtyKGMsYil9O2g9YS5zY3JpcHRzLnNoaWZ0KCk7KWUuZmgoaCxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbCl9ZWxzZSByKGMsYil9ZWxzZSByKGMsYil9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRG49dGhpcy5hWzZdO3RoaXMuTHA9dGhpcy5hWzZdO3RoaXMueG09dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5IcD1iO2IucHJvdG90eXBlPXtDbjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRG46dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxwOnRoaXMud20oYSl9LHdtOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy54bTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGhhPWMuSHB8fGhhLHJjPW5ldyBoYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLAoidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1yYy5Dbig0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zbz0hMTt0aGlzLlhiPSJzZXR1cCI7dGhpcy5LYz1bXTt0aGlzLmllKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuQXQuYmluZCh0aGlzKSk7dGhpcy5uYj17fTt0aGlzLk5nPXt9O3RoaXMuWmU9ITF9Yy5Gaj1iO2IucHJvdG90eXBlPXtIdTpmdW5jdGlvbigpe3ZhciBhPSIiLGI7Zm9yKGIgaW4gdGhpcy5uYil0aGlzLm5iLmhhc093blByb3BlcnR5KGIpJiYoYSs9Yit0aGlzLm5iW2JdKyJfIik7cmV0dXJuIGF9LEFjOmZ1bmN0aW9uKCl7dGhpcy5aZXx8KHRoaXMuWmU9ZS5hYSgxMCkpO3JldHVybiB0aGlzLlplfSxvYjpmdW5jdGlvbihhKXt0aGlzLm5iW2FdfHwodGhpcy5uYlthXT0wKTt0aGlzLm5iW2FdKz0xOzU8dGhpcy5uYlthXSYmIXRoaXMuTmdbYV0mJih0aGlzLk5nW2FdPSEwLCJuZXdCaWdBZElkIj09YSYmdGhpcy50cmFjaygic3RhdHNfaGRfY2hlY2t0cmFja3MiLAp0aGlzLkh1KCksITApKX0saWU6ZnVuY3Rpb24oKXt0aGlzLmJhPXt1cmxzOnt9LGhvbWFkVXJsczp7fSxvcmlnaW5hbFVybHM6e30sc2NyaXB0czp7fSxldmVudGxpc3RlbmVyOltdLGdlbmVyYWxFdmVudGxpc3RlbmVyOltdLGlGcmFtZXM6W10saUZyYW1lT25Mb2FkSGFuZGxlcjp7fSxpRnJhbWVVcmw6IiIsdHJhY2U6W10sc3RhY2s6W10sZXJybXNnOltdfX0sbW46ZnVuY3Rpb24oYSl7dGhpcy5iYS5lcnJtc2cucHVzaChhKX0scG9zdE1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt0cnl7YS5jb250ZW50V2luZG93JiYoYT1hLmNvbnRlbnRXaW5kb3cpfWNhdGNoKGQpe31hJiZhLnBvc3RNZXNzYWdlJiZhLnBvc3RNZXNzYWdlKGIsIioiKX0sbGE6ZnVuY3Rpb24oYSxiLGQpe3RoaXMucG9zdE1lc3NhZ2UoYSx7dHlwZToidnBhaWQiLGV2ZW50OmIsZGF0YTpkfSl9LEF0OmZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLnR5cGUmJiJ2cGFpZCI9PWEuZGF0YS50eXBlJiZ0aGlzLnp0KGEuZGF0YSl9LAp6dDpmdW5jdGlvbihhKXtpZih0aGlzLmJhJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXIpZm9yKHZhciBiPXRoaXMuYmEuZXZlbnRsaXN0ZW5lci5sZW5ndGgsZD0wO2Q8YjtkKyspdGhpcy5iYSYmdGhpcy5iYS5ldmVudGxpc3RlbmVyJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0mJmEuZXZlbnQ9PXRoaXMuYmEuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLmJhLmV2ZW50bGlzdGVuZXJbZF0uY2IoYSl9LGFlOmZ1bmN0aW9uKGEsYil7dGhpcy5iYS5ldmVudGxpc3RlbmVyLnB1c2goe25hbWU6YSxjYjpifSl9LGxnOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudHEoYSksZD0hMTtpZihiKXJldHVybiB0aGlzLmVoKGEsIlBPU1QiLHtob21hZF9yZXNvbHZlX2hhc2g6Yn0sZnVuY3Rpb24oYSl7dHJ5e2Q9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCkudXJsfWNhdGNoKGIpe2NvbnNvbGUubG9nKCJ3dGYiLGIpfX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSx0cTpmdW5jdGlvbihhKXt2YXIgYj0KbmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFthLWYwLTldezQwfSkuPyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIik7aWYoKGI9Yi5leGVjKGEpKSYmKGJbMl18fGJbNV0pKXtpZihiWzJdKXJldHVybiBiWzJdO2lmKGJbNV0pcmV0dXJuIGJbNV19ZWxzZSBpZihiPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8/KFthLWYwLTldezQwfSkvPyQiLCJnIiksKGI9Yi5leGVjKGEpKSYmYls0XSlyZXR1cm4gYls0XTtyZXR1cm4hMX0sa246ZnVuY3Rpb24oYSxiKXtpZihiJiYhKDA+dGhpcy52YShhKS5ob3N0LmluZGV4T2YoImRhbW9oIikpKXtpZihhPT1iKXtpZihlLmVxKGEpKXJldHVybjsoYj10aGlzLmxnKGEpKXx8KGI9YSl9MD09PWIuaW5kZXhPZigiLy8iKSYmKGI9Imh0dHBzOiIrYik7dGhpcy5iYS51cmxzW2FdPWI7dGhpcy5iYS51cmxzW2JdPWE7dGhpcy5iYS5ob21hZFVybHNbYV09Yjt0aGlzLmJhLm9yaWdpbmFsVXJsc1tiXT0KYX19LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEuaG9tYWRVcmxzW2FdJiYoYj10aGlzLmJhLmhvbWFkVXJsc1thXSk7cmV0dXJuIGJ9LHRnOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMuYmEub3JpZ2luYWxVcmxzJiZ0aGlzLmJhLm9yaWdpbmFsVXJsc1thXSYmKGI9dGhpcy5iYS5vcmlnaW5hbFVybHNbYV0pO3JldHVybiBifSxmYjpmdW5jdGlvbihhLGIpe2J8fChiPSIiKTt0aGlzLnRyYWNrKCJzdGF0c192cGFpZF9jYWNoZV8iK2EsYiwhMCl9LEpyOmZ1bmN0aW9uKGEpe3JldHVybiJhYm91dDpibGFuayI9PWF8fCJhYm91dDpzZWxmIj09YXx8IiI9PWF9LHNlOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0sQ2c6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6CiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxKaDpmdW5jdGlvbihhKXtmb3IoO2EhPWRvY3VtZW50LmJvZHkmJm51bGwhPWE7KWE9YS5wYXJlbnRFbGVtZW50O3JldHVybiBhPT1kb2N1bWVudC5ib2R5PyEwOiExfSxXZzpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGE9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9YS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LHplOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxmPTAscT0wLGM9MCwKZT0hMTtpZighYXx8IWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBnPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWcpcmV0dXJuITE7cT1nLmhlaWdodCpnLndpZHRoO2Q9Zy53aWR0aDtmPWcuaGVpZ2h0OzA+Zy50b3AmJihmKz1nLnRvcCk7Zy5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1nLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5nLmxlZnQmJihkKz1nLmxlZnQpO2cucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09Zy5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOwowPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxxJiYoYz0xMDAvcSpkKmYpO2M+PWImJihlPSEwKTtyZXR1cm4gZX0sQWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy56ZShhLmVsLGEucGVyY2VudCk7YS5zdGFydFRpbWV8fChhLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYil7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYS5zdGFydFRpbWU+PWEudGltZU1TKXthLmNiKCk7cmV0dXJufX1lbHNlIGEuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5BZShhKX0uYmluZCh0aGlzKSwxMDApfSxHYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxhYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDwKYTtkKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LHVlOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxmO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBifSxGaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBoPSIiLGYsZDtmb3IoZj03OzA8PWY7Zi0tKWQ9YT4+PjQqZiYxNSxoKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gaH1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGYscSxjPUFycmF5KDgwKSxlPTE3MzI1ODQxOTMsZz00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixsPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbix4LHUscixwO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHQ9W107Zm9yKGY9CjA7ZjxuLTM7Zis9NClxPWEuY2hhckNvZGVBdChmKTw8MjR8YS5jaGFyQ29kZUF0KGYrMSk8PDE2fGEuY2hhckNvZGVBdChmKzIpPDw4fGEuY2hhckNvZGVBdChmKzMpLHQucHVzaChxKTtzd2l0Y2gobiU0KXtjYXNlIDA6Zj0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpmPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpmPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmY9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHQucHVzaChmKTsxNCE9dC5sZW5ndGglMTY7KXQucHVzaCgwKTt0LnB1c2gobj4+PjI5KTt0LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8dC5sZW5ndGg7YSs9MTYpe2ZvcihmPTA7MTY+ZjtmKyspY1tmXT10W2ErZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLQo4XV5jW2YtMTRdXmNbZi0xNl0sMSk7cT1lO249Zzt4PWs7dT1sO3I9bTtmb3IoZj0wOzE5Pj1mO2YrKylwPWQocSw1KSsobiZ4fH5uJnUpK3IrY1tmXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtmb3IoZj0yMDszOT49ZjtmKyspcD1kKHEsNSkrKG5eeF51KStyK2NbZl0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHI9dSx1PXgseD1kKG4sMzApLG49cSxxPXA7Zm9yKGY9NDA7NTk+PWY7ZisrKXA9ZChxLDUpKyhuJnh8biZ1fHgmdSkrcitjW2ZdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxyPXUsdT14LHg9ZChuLDMwKSxuPXEscT1wO2ZvcihmPTYwOzc5Pj1mO2YrKylwPWQocSw1KSsobl54XnUpK3IrY1tmXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscj11LHU9eCx4PWQobiwzMCksbj1xLHE9cDtlPWUrcSY0Mjk0OTY3Mjk1O2c9ZytuJjQyOTQ5NjcyOTU7az1rK3gmNDI5NDk2NzI5NTtsPWwrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZSkrCmIoZykrYihrKStiKGwpK2IobSkpLnRvTG93ZXJDYXNlKCl9LHhiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkLGYscSxjLGUsZyxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxmPWEuY2hhckNvZGVBdChrKyspLHE9YS5jaGFyQ29kZUF0KGsrKyksYz1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxlPShmJjE1KTw8MnxxPj42LGc9cSY2Myxpc05hTihmKT9lPWc9NjQ6aXNOYU4ocSkmJihnPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoYykrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZyk7CnJldHVybiBifSxGcjpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudmVuZG9yJiYtMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LGZkOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGY9ITEscT0hMSxjPSExLGU9ITEsZz0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHIpe310cnl7Zj13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5SYj8hMDohMX1jYXRjaCh1KXt9dHJ5e3E9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxjPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxlPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGc9LTEhPQpuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIk1TSUUiKSxsPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkNocm9tZSIpLGs9IWcmJiEhd2luZG93LlN0eWxlTWVkaWF8fC0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkVkZ2UiKSxtPShsfHxxKSYmISF3aW5kb3cuQ1NTfWNhdGNoKHApe31hLmlzUGhhbnRvbUpTPWI7YS5pc0Nocm9tZUhlYWRsZXNzPWQ7YS5pc0ZpcmVmb3hIZWFkbGVzcz1mO2EuaXNPcGVyYT1xO2EuaXNGaXJlZm94PWM7YS5pc1NhZmFyaT1lO2EuaXNJRT1nO2EuaXNFZGdlPWs7YS5pc0Nocm9tZT1sO2EuaXNCbGluaz1tO3JldHVybiBhfSxTYTpmdW5jdGlvbigpe3ZhciBhPXtDaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BbmRyb2lkL2kpfSxKaTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9CbGFja0JlcnJ5L2kpfSxacTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSwKQ2w6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvT3BlcmEgTWluaS9pKX0sT206ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvSUVNb2JpbGUvaSl9LEFrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01vYmlsZS9pKX0sJGw6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU2Ftc3VuZy9pKXx8bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvU00tL2kpfSxobzpmdW5jdGlvbigpe3JldHVybiBhLkNpKCl8fGEuSmkoKXx8YS5acSgpfHxhLkNsKCl8fGEuT20oKXx8YS5BaygpfHxhLiRsKCl9fTtyZXR1cm4gbnVsbCE9YS5obygpfSx2YTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTsKYT0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGEpO2Zvcih2YXIgZD17fSxmPTE0O2YtLTspZFtiW2ZdXT1hW2ZdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixoKXtiJiYoZC5xdWVyeUtleVtiXT1oKX0pO3JldHVybiBkfSx1bmlxdWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGQ9W10sZj0wLHE9YS5sZW5ndGg7ZjxxOysrZiliLmhhc093blByb3BlcnR5KGFbZl0pfHwoZC5wdXNoKGFbZl0pLGJbYVtmXV09MSk7cmV0dXJuIGR9LEJjOmZ1bmN0aW9uKGEpe2E9dGhpcy52YShhKS5ob3N0LnNwbGl0KCIuIik7CnZhciBiPSIiO2FbYS5sZW5ndGgtMl0mJihiKz1hW2EubGVuZ3RoLTJdKyIuIik7YVthLmxlbmd0aC0xXSYmKGIrPWFbYS5sZW5ndGgtMV0pO3JldHVybiBifSx6YTpmdW5jdGlvbihhKXt2YXIgYj0iIixkPSExO3dpbmRvdyYmd2luZG93LmxvY2F0aW9uJiZ3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUmJihiPXdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7YiYmLTE8Yi5pbmRleE9mKGEpJiYoZD0hMCk7cmV0dXJuIGR9LENxOmZ1bmN0aW9uKCl7dmFyIGE9IiIsYj0iIixkPSIiO3RyeXthPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGI9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGE9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGI9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudmEoZG9jdW1lbnQucmVmZXJyZXIpLGE9ZC5ob3N0LGI9ZC5wYXRoKX1yZXR1cm4gYStifSxmcDpmdW5jdGlvbihhLApiKXtmb3IodmFyIGQ9W10sZj1bXSxxPTA7cTxiLmxlbmd0aDtxKyspZFtiW3FdXT0hMDtmb3IocT0wO3E8YS5sZW5ndGg7cSsrKWRbYVtxXV18fGYucHVzaChhW3FdKTtyZXR1cm4gZn0sQ3U6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxmPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGY9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZik6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChxKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSx5ZzpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMuWGgoYikrIjoiK3RoaXMuWGgoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LFhoOmZ1bmN0aW9uKGEpe3JldHVybiAxMD5hPyIwIithLnRvU3RyaW5nKCk6YS50b1N0cmluZygpfSxhZjpmdW5jdGlvbihhKXt0aGlzLlhiPQphfSx2ZzpmdW5jdGlvbihhLGIsZCl7dmFyIGY7ZC5zdGF0ZT10aGlzLlhiO3RoaXMuVmYoZCk7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQ/Zj1uZXcgQ3VzdG9tRXZlbnQoYix7ZGV0YWlsOmR9KTooZj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxmLmluaXRDdXN0b21FdmVudChiLCExLCExLGQpKTthLmRpc3BhdGNoRXZlbnQoZil9LHljOmZ1bmN0aW9uKGEsYixkKXtifHwoYj0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy52ZyhkLGIsYSl9LHY6ZnVuY3Rpb24oYSxiLGQsZixxLGMsZyl7dmFyIEI9YTtkJiZiJiYoYj1rLllhKGIsZCkpO2ImJihCPWsuWWEoYSxiKSk7ZiYmKEI9ay5ZYShCLGYpKTtxJiYoQj1rLllhKEIscSkpO2MmJihCPWsuWWEoQixjKSk7ZyYmKEI9ay5ZYShCLGMpKTtlLnljKEIpfSxDdDpmdW5jdGlvbihhKXt2YXIgYj17fTtpZighYS5jb2RlKXJldHVybiExO2lmKGEuc3BlY2lhbF90cmFjayliPWE7ZWxzZSBpZighKGEuY29kZSYmCjEwMDU8PWEuY29kZSYmMTAyOT49YS5jb2RlKXx8MTAyMz09YS5jb2RlfHwxMDE4PT1hLmNvZGUpcmV0dXJuO3RyeXtpYSYmKGIuc2Vzc2lvbl9pZD1pYSk7Yi5hZHNlc3Npb25faWQ9YS5hZHNlc3Npb25faWQ/YS5hZHNlc3Npb25faWQ6ImVwb24iO2EuaG9tYWRJbXByZXNzaW9uQWRJZCYmKGIuYWRfaWQ9YS5ob21hZEltcHJlc3Npb25BZElkKTtiLmV2ZW50PWEuY29kZTtiLnNpdGVfaHJlZj10aGlzLkNxKCk7aWYoYS5zdGF0ZSlzd2l0Y2goYS5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6Yi5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmIucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6Yi5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6Yi5wb3NpdGlvbj0wfWEudmlkZW9fZHVyYXRpb24mJihiLnZpZGVvX2R1cmF0aW9uPWEudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYn0sVmY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5DdChhKTtpZihiKWlmKCFsfHwKIWwuWSl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmYoYil9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGIpdHJ5e2I9SlNPTi5zdHJpbmdpZnkoYil9Y2F0Y2goZCl7Yj1iLnRvU3RyaW5nP2IudG9TdHJpbmcoKToiIn1iJiZiLnRyaW0mJihiPWIudHJpbSgpKTthPWwuemQoKTtsLnhhKGEsITApO2E9bC54YShhLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjthLmRhdGEuaG9tYWRfYXQ9YjtsLklhKGEsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGEsYixkKXtpZihkKWlmKCFsfHwhbC5ZKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhhLGIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKGwuaXNFbmFibGVkKXthJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTt2YXIgZj1hK2I7dGhpcy5NY3x8KHRoaXMuTWM9e30pOwp0aGlzLk1jW2ZdfHwodGhpcy5NY1tmXT0wKTt0aGlzLk1jW2ZdKys7MTA8dGhpcy5NY1tmXXx8KGY9bC56ZCgpKyI/aG9tYWRfdHJhY2tfa2V5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyImaG9tYWRfdHJhY2tfdmFsdWU9IitlbmNvZGVVUklDb21wb25lbnQoYiksbC54YShmLCEwKSxmPWwueGEoZiwhMCksZi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiIsZi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGEpKyIqIixmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChiKSsiKiIsbC5JYShmLGZ1bmN0aW9uKGYpe3ZhciBkPSExO2Y9Zi5yZXNwb25zZVRleHQ7dHJ5e2Y9SlNPTi5wYXJzZShmKSxmPWYuZGF0YSxmWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihkPSEwKSxmWzFdJiZmWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYikmJihkPSExKX1jYXRjaChjKXt9ZHx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsCihmWzBdP2ZbMF06IiIpKyhmWzFdP2ZbMV06IiIpLCEwKX0uYmluZCh0aGlzKSkpfX0sR2U6ZnVuY3Rpb24oKXtsJiZsLlk/bC5pc0VuYWJsZWQmJmwuRm8oKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2UoKX0uYmluZCh0aGlzKSw1MDApfSxxZTpmdW5jdGlvbihhLGIpe3JldHVybiBhJiYib2JqZWN0Ij09dHlwZW9mIGEmJmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYikubGVuZ3RoP3RoaXMua2IoYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKVswXSk6IiJ9LHRlOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmNoaWxkTm9kZXMmJmEuY2hpbGROb2Rlc1swXT9hLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gYT90aGlzLmxkKGEpOiIifSxsZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnRlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn0sJGY6ZnVuY3Rpb24oYSwKYixkLGYpe2Q9ITE7aWYoYi5CZShhKXx8dGhpcy5KcihhKXx8MDw9YS5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGE7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LlllJiZ3aW5kb3cuc2FuZGJveC5ZZVsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHxzYW5kYm94LlllWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKTtpZih0aGlzLnRnKGEpKXJldHVybiB0aGlzLnRnKGEpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2YmJmYucG9zdCYmKGNbIlgtSG9tYWQtUG9zdCJdPSJ0cnVlIik7CmQmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLlphKGEsYi5IYSxjLGZ1bmN0aW9uKGEpe2U9YS5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxiLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGcpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9Yi5vZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy5rbihlLGEpO3JldHVybiBlfSxaYTpmdW5jdGlvbihhLGIsZCxmLGMsZSxnLGspe3ZhciBtPWV8fGw7ZT0hMDtrJiYoZT0hMSk7aWYobSYmbS5ZKWlmKG0uaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl0cnl7YT1hKCl9Y2F0Y2godGMpe2ModGMpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7CmVsc2V7bS54YShhLGUpO2U9bS54YShhLGUpO2UuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPWI7ZS5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciByIGluIGQpZS5kYXRhW3JdPWRbcl07cmV0dXJuIG0uSWEoZSxmLGMsIiIsIiIsZyl9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlphKGEsYixkLGYsYyxtLGcsayl9LmJpbmQodGhpcyksNTAwKX0sZWg6ZnVuY3Rpb24oYSxiLGQsZixjLGUsZyl7dmFyIGs9ITA7ZyYmKGs9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zz1kO2Q9IiI7Zm9yKHZhciBtIGluIGcpZCs9IiYiK20rIj0iK2VuY29kZVVSSUNvbXBvbmVudChnW21dKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFmfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGYobCk7YyYmND09bC5yZWFkeVN0YXRlJiYKMjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1cyYmYyhsKX07dHJ5e2wub3BlbihiLGEsayksbC53aXRoQ3JlZGVudGlhbHM9ZSwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChyKXtjJiZjKCl9cmV0dXJuIGx9LCRyOmZ1bmN0aW9uKGEsYixkKXt0aGlzLmVoKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLktjKWZvcih2YXIgYyBpbiB0aGlzLktjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuS2NbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitlLnhiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKToKZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChjKTtiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LGZoOmZ1bmN0aW9uKGEsYixkLGYpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy54YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWmEoYSxmLkhhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy4kcihmLm9kKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGYsITApfSxwdTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LYz1hfSx3dzpmdW5jdGlvbihhLGIsZCxmLGMpe3RoaXMuWmEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTsKZFswXSYmKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzpmfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9Y2F0Y2goZSl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86Zn0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9KX0saW86ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxEcjpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspaWYoYltmXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFE9Yy5Ganx8UTtuZXcgUTt2YXIgZT1uZXcgUTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5Faj1iO2IuWWE9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxmO2ZvcihmIGluIGIpZFtmXT1iW2ZdO2ZvcihmIGluIGEpZFtmXT1hW2ZdO3JldHVybiBkfTtiLnB0PXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLnpzPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5kdz17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLk1wPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iuc3c9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5UZj17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5MZj17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IuUWY9e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IuVWY9e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLmNuPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5PZj17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLkh2PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55cz17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5OcD17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2Iub3c9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuaGc9e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Vbz17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLmJkPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IuYWQ9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLlNmPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi5lbj17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuUmM9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLldkPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLllkPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuZG49e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLmRpPXtjb2RlOiIxMDI1Iix0eXBlOiJ2aWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJ2aWV3YWJsZSJ9O2IuQnM9e2NvZGU6IjEwMjYiLHR5cGU6Im5vdFZpZXdhYmxlIixtZXNzYWdlOiIiLG5hbWU6Im5vdFZpZXdhYmxlIn07Yi5zZD17Y29kZToiMTAyNyIsdHlwZToibXV0ZSIsbWVzc2FnZToiIixuYW1lOiJtdXRlIn07Yi5wZj17Y29kZToiMTAyOCIsdHlwZToidW5tdXRlIixtZXNzYWdlOiIiLG5hbWU6InVubXV0ZSJ9O2IuaWc9e2NvZGU6IjEwMjkiLHR5cGU6ImNvbnRlbnRQbGF5ZXJNdXRlZCIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyTXV0ZWQifTtiLmN3PXtjb2RlOiIxMDMwIix0eXBlOiJ2cGFpZGVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkR2PXtjb2RlOiIxMDMxIix0eXBlOiJ2YXN0ZHVtbXlhZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07CmIuRXY9e2NvZGU6IjEwMzIiLHR5cGU6InZhc3RkdXJhdGlvbmVycm9yIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTtiLkN2PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuQXM9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9fX0pKGMpO3ZhciBrPWMuRWp8fGs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuZnc9dGhpcy5hWzhdO3RoaXMuZW89dGhpcy5hWzNdO3RoaXMudGk9dGhpcy5hWzRdO3RoaXMuVGo9dGhpcy5hWzhdO3RoaXMubW09dGhpcy5hWzldO3RoaXMuY3I9CnRoaXMuYVsyXTt0aGlzLnNyPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs4XX1jLnJuPWI7Yi5wcm90b3R5cGU9e2V3OmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5mdzp0aGlzLmNvKGEpfSxjbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZW86dGhpcy5zaShhKX0sc2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy50aTp0aGlzLlNqKGEpfSxTajpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuVGo6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm1tOnRoaXMuYnIoYSl9LGJyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jcjp0aGlzLnJyKGEpfSxycjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuc3I6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYT1jLnJufHxqYSx1Yz1uZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9dWMuZXcoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt9Yy5Haj1iO2IucHJvdG90eXBlPXt1ZTpmdW5jdGlvbihhKXt2YXIgYj0wLGQsZixjO2lmKDA9PWEubGVuZ3RoKXJldHVybiBiO2Q9MDtmb3IoYz1hLmxlbmd0aDtkPGM7ZCsrKWY9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZixifD0wO3JldHVybiBNYXRoLmFicyhiKX0samE6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwLzI0KStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLkR8fCJ4Iil9LHhxOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lKwpuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuRHx8IngiKSsobmV3IERhdGUpLnRvVGltZVN0cmluZygpLnN1YnN0cigtMTIpfSxqZDpmdW5jdGlvbihhKXthPXBhcnNlSW50KGEpO2lmKDY1PD1hJiY5MD49YXx8OTc8PWEmJjEyMj49YSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKTtpZigwPj1hKXJldHVybiIiO2lmKDY1PmEpcmV0dXJuIHRoaXMuamQoYSs2NSk7aWYoOTA8YSlyZXR1cm4gdGhpcy5qZChNYXRoLnJvdW5kKGEvMikpfSxyZXZlcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixkPWEubGVuZ3RoLTEsYj0iIjswPD1kO2IrPWFbZC0tXSk7cmV0dXJuIGJ9LGlhOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudWUodGhpcy5qYSgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSwKYj0iIixkPTA7ZDxhLmxlbmd0aDtkKyspYis9dGhpcy5qZChhW2RdKTswPT1iLmxlbmd0aCYmKGI9InpvcmsiKTtyZXR1cm4gYn0seXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYSgpKyIyIn0sVGc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy51ZSh0aGlzLnhxKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuamQoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9fX0pKGMpO3ZhciBKPWMuR2p8fEo7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuQXc9dGhpcy5hWzNdO3RoaXMuQXA9dGhpcy5hWzJdO3RoaXMuYXY9dGhpcy5hWzEwXTt0aGlzLnZpPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs0XX1jLmR1PWI7Yi5wcm90b3R5cGU9e3p3OmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuQXc6dGhpcy56cChhKX0senA6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkFwOnRoaXMuJHUoYSl9LCR1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hdjp0aGlzLnVpKGEpfSx1aTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudmk6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBrYT1jLmR1fHxrYSx2Yz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD12Yy56dyg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fXZhciBhPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLztiLmV4dGVuZD1mdW5jdGlvbihoKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBoKWZbY109ImZ1bmN0aW9uIj09PQp0eXBlb2YgaFtjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChoW2NdKT9mdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBoPXRoaXMubzt0aGlzLm89ZFthXTt2YXIgZj1iLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLm89aDtyZXR1cm4gZn19KGMsaFtjXSk6aFtjXTtoPSJmdW5jdGlvbiI9PT10eXBlb2YgZi5sP2YuaGFzT3duUHJvcGVydHkoImluaXQiKT9mLmw6ZnVuY3Rpb24oKXtkLmwuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307aC5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWg7aC5leHRlbmQ9Yi5leHRlbmQ7cmV0dXJuIGh9O2MuUWk9Yn0pKGMpO3ZhciBMPWMuUWl8fEw7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTGk9dGhpcy5hWzddO3RoaXMuaGo9dGhpcy5hWzEwXTt0aGlzLnpuPXRoaXMuYVs0XTt0aGlzLnJpPQp0aGlzLmFbOV07dGhpcy5Ucj10aGlzLmFbOV07dGhpcy50bj10aGlzLmFbMTBdO3RoaXMuT2s9dGhpcy5hWzNdO3RoaXMua289dGhpcy5hWzVdO3RoaXMuY3Q9dGhpcy5hWzFdO3RoaXMuS249dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNV19Yy53bD1iO2IucHJvdG90eXBlPXtLaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuTGk6dGhpcy5naihhKX0sZ2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmhqOnRoaXMueW4oYSl9LHluOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy56bjp0aGlzLnBpKGEpfSxwaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMucmk6dGhpcy5TcihhKX0sU3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlRyOnRoaXMuc24oYSl9LHNuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMudG46dGhpcy5OayhhKX0sTms6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Pazp0aGlzLmpvKGEpfSxqbzpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLmtvOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5jdDp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuS246dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYT1jLndsfHxsYSx3Yz1uZXcgbGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD13Yy5LaSg0KTtjPWN8fHt9OyhmdW5jdGlvbihjKXtjLk5sPUwuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuS2E9e307dGhpcy5JPW51bGw7dGhpcy5IYz0xMDA7dGhpcy5IYj0wO3RoaXMuVGE9MTUwO3RoaXMuS2I9MDt0aGlzLmt1KGIpfSxnOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYT8odGhpcy5IYisrLHRoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksCnRoaXMuSGMpKTowPnRoaXMuVGEmJih0aGlzLktiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLHRoaXMuSGMpKX0sWHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IYj50aGlzLlRhPyEwOiExfSxYZTpmdW5jdGlvbigpe3RoaXMuSGI9MH0sUDpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGt1OmZ1bmN0aW9uKGIpe3RoaXMuST1ifSx2cTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkl9LFI6ZnVuY3Rpb24oYil7ZS50cmFjaygic3RhdHNfcGxheWVyIixiLlAoKSwhMCk7dGhpcy5LYVtiLmphKCldPWI7TSYmTS5haCYmTS5HdShiKX0sV3c6ZnVuY3Rpb24oKXtyZXR1cm4gZS5zZSh0aGlzLkthKX0sTjpmdW5jdGlvbihiKXt2YXIgYT1iLnZpZGVvVGFnLGg7Zm9yKGggaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2hdLnZpZGVvVGFnKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9LEVyOmZ1bmN0aW9uKGIpe2I9Yi5HYSgpO2Zvcih2YXIgYSBpbiB0aGlzLkthKWlmKGIuaWQ9PQp0aGlzLkthW2FdLkdhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LG54OmZ1bmN0aW9uKGIpe3RoaXMuS2FbYi5pZF09bnVsbH19KX0pKGMpO3ZhciBwPWMuTmx8fHA7KGZ1bmN0aW9uKGMpe2MuUGw9TC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5IYz0xMDt0aGlzLkhiPTA7dGhpcy5UYT01MDt0aGlzLlc9bnVsbDt0aGlzLm1hPSExO3RoaXMucGxheWVyPWI7dGhpcy5CYj0iIjt0aGlzLm5nPSExO3RoaXMuTSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuImVtcHR5In0sczpmdW5jdGlvbigpe3ZhciBiPXt9LGE9dGhpcy52aWRlb1RhZyxoPXRoaXMuR2EoKSxkPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWgpYi5jb250YWluZXJJZD1oLmlkO2QmJihiLnBsYXllcj1kKTtyZXR1cm4gYn0sTTpmdW5jdGlvbigpe30sTGE6ZnVuY3Rpb24oKXt9LApzdTpmdW5jdGlvbihiKXt0aGlzLlc9Yn0sWHc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XfSxudTpmdW5jdGlvbihiKXt0aGlzLkplPWJ9LFZ3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSmV9LEllOmZ1bmN0aW9uKCl7fSxUOmZ1bmN0aW9uKCl7dGhpcy5IYjw9dGhpcy5UYSYmKHRoaXMuSGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk0uYmluZCh0aGlzKSx0aGlzLkhjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RyeXtpZihkb2N1bWVudC5leGl0RnVsbHNjcmVlbilkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpWyJjYXRjaCJdKGZ1bmN0aW9uKCl7fSk7ZWxzZSBpZihkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbilkb2N1bWVudC53ZWJraXRFeGl0RnVsbHNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbilkb2N1bWVudC5tb3pDYW5jZWxGdWxsU2NyZWVuKCk7ZWxzZSBpZihkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKWRvY3VtZW50Lm1zRXhpdEZ1bGxzY3JlZW4oKTsKZWxzZSByZXR1cm4hMX1jYXRjaChiKXt9fSxCZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxqYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlkfSxCZDpmdW5jdGlvbihiKXt0aGlzLmlkPWJ9LHB4OmZ1bmN0aW9uKCl7fSxaOmZ1bmN0aW9uKGIpe2lmKCFiKXJldHVybiExO3RoaXMudmlkZW9UYWc9Yjt0aGlzLlFxKCl8fHRoaXMuZm4oKTt0aGlzLkJkKHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpKX0sWXc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZ30sZm46ZnVuY3Rpb24oKXt0aGlzLnZpZGVvVGFnLnNldEF0dHJpYnV0ZSgiaWQiLGUuYWEoMTApKX0sUXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFY6ZnVuY3Rpb24oYil7dGhpcy5jb250YWluZXI9CmJ9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LHllOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuY3VycmVudFRpbWU/Yi5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIuZHVyYXRpb24/Yi5kdXJhdGlvbjowfSxKYTpmdW5jdGlvbigpe3JldHVybiExfSxmeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hfSxjYTpmdW5jdGlvbigpe3RoaXMubWE9ITB9LEljOmZ1bmN0aW9uKCl7dmFyIGI9bTtyZXR1cm4gYiYmYi5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMudmlkZW9UYWc7cmV0dXJuIGImJmIubXV0ZWQ/Yi5tdXRlZDohMX0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sRWg6ZnVuY3Rpb24oYil7dGhpcy5CYj1ifSxVdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkJifSx6aDpmdW5jdGlvbigpe3RoaXMuQmI9bnVsbH0sJHc6ZnVuY3Rpb24oKXt2YXIgYj0hMTt0aGlzLkJiJiYoYj0hMCk7cmV0dXJuIGJ9LGt4OmZ1bmN0aW9uKCl7dGhpcy5uZ3x8KHRoaXMubmc9ITApfSxwZTpmdW5jdGlvbigpe3JldHVybiExfSxSdzpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHQ9Yy5QbHx8dDsoZnVuY3Rpb24oYyl7Yy5taT1MLmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMuST10aGlzLnBsYXllcj0iIjt0aGlzLkhmPSIxIjt0aGlzLklmPSIyIjt0aGlzLlptPSIzIjt0aGlzLk9jPTA7dGhpcy5paD0KMzA7dGhpcy5QYj1bXTt0aGlzLmdiPVtdO3RoaXMubWM9e2V4dGVybmFsOjEsbm9mcmFtZXdvcms6MixhZGVycm9yOjMsY29udGVudHBsYXk6NCxub0Fkc01hbmFnZXI6NSx1bmtub3duOjZ9O3RoaXMuV2Y9dGhpcy4kaD0hMTt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaWQ9ZS5hYSgxMCk7dGhpcy5iZihiKTt0aGlzLmx1KGEpfSxnOmZ1bmN0aW9uKCl7fSx0YTpmdW5jdGlvbigpe3RoaXMuJGh8fCh0aGlzLiRoPSEwLGUuR2UoKSl9LE5lOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5QKCk7UiYmUi5ZYiYmIW1hJiYobWE9ITAsZS50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdnI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGE9bmV3IEo7d2luZG93W2EuaWEoKV18fCh3aW5kb3dbYS5pYSgpXT17fSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXXx8KHdpbmRvd1thLmlhKCldW2IuamEoKV09e30sd2luZG93W2EuaWEoKV1bYi5qYSgpXS5pbml0aWF0b3I9CmUuQWMoKSk7d2luZG93W2EuaWEoKV1bYi5qYSgpXVtlLkFjKCldP3dpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXSsrOndpbmRvd1thLmlhKCldW2IuamEoKV1bZS5BYygpXT0xfSxCcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCksYT0hMCxoPW5ldyBKO3dpbmRvd1toLmlhKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldJiZ3aW5kb3dbaC5pYSgpXVtiLmphKCldLmluaXRpYXRvciE9ZS5BYygpJiYodGhpcy5jZigpLGE9ITEpO3JldHVybiBhfSxHOmZ1bmN0aW9uKGIsYSl7dmFyIGg9ITA7YiYmKGg9ITEpO2lmKCF0aGlzLnVhKCkpe3RoaXMudnIoKTtpZighdGhpcy5CcigpKXtlLnRyYWNrKCJzdGF0c19oZF9kb3VibGVNYWluIiwiIiwhMCk7dGhpcy5jZigpO3JldHVybn10aGlzLmNmKCk7dGhpcy5JKHRoaXMuZ2V0UGxheWVyKCksaCk7dGhpcy5UaCgpO3RoaXMuV2Y9ITA7YSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKTtyZXR1cm4hMH1yZXR1cm4hMX0sdTpmdW5jdGlvbihiLAphKXt0aGlzLnVhKCl8fCh0aGlzLlBiLnB1c2goYiksdGhpcy5nYi5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sVGg6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLlBiJiYwPHRoaXMuUGIubGVuZ3RoJiYodGhpcy5QYj1lLnVuaXF1ZSh0aGlzLlBiKSxlLnRyYWNrKCJhY3RpdmF0ZWRCeSIsdGhpcy5QYi5qb2luKCIsIikpKTtpZih0aGlzLmdiKXtmb3IodmFyIGg9MDtoPHRoaXMuZ2IubGVuZ3RoO2grKyl0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXT09dGhpcy5tY1tiXSYmYS5wdXNoKHRoaXMuZ2JbaF0uZGV0YWlsKSx0aGlzLm1jW3RoaXMuZ2JbaF0ucmVhc29uXTx0aGlzLm1jW2JdJiYoYT1bXSxhLnB1c2godGhpcy5nYltoXS5kZXRhaWwpLGI9dGhpcy5nYltoXS5yZWFzb24pO3RoaXMubWNbYl18fChiPSJ1bmtub3duIixhPVtdKTswPGEubGVuZ3RoJiYoaD1lLnVuaXF1ZShhKSxiPWIrIi0iK2guam9pbigiLSIpKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLApiLCEwLGEpfX0sWnc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5XZn0sdzpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuSGZ9LGNmOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5JZn0scXU6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLlptfSxyYTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuT2N9LE5mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzPT10aGlzLkhmfSxIdzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5JZn0sdWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXMhPXRoaXMuT2N9LGJmOmZ1bmN0aW9uKGIpe3RoaXMucGxheWVyPWJ9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sbHU6ZnVuY3Rpb24oYil7dGhpcy5JPWJ9LHZxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSX0sY3M6ZnVuY3Rpb24oKXt9fSl9KShjKTt2YXIgdj1jLm1pfHx2O2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Zbj10aGlzLmFbN107dGhpcy5KbD10aGlzLmFbOV07dGhpcy5tcD10aGlzLmFbOF07dGhpcy5zbT10aGlzLmFbMTBdO3RoaXMuYXE9dGhpcy5hWzVdO3RoaXMueWw9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzRdfWMuZXA9YjtiLnByb3RvdHlwZT17WG46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Zbjp0aGlzLklsKGEpfSxJbDpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkpsOnRoaXMubHAoYSl9LGxwOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5tcDp0aGlzLnJtKGEpfSxybTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuc206dGhpcy4kcChhKX0sJHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmFxOnRoaXMueGwoYSl9LHhsOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy55bDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7CnZhciBuYT1jLmVwfHxuYSx4Yz1uZXcgbmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD14Yy5Ybig0KTsoZnVuY3Rpb24oYyl7Yy5waj10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvQ29udGFpbmVyO3RoaXMuVihiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW87dGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iRXhwUGxheWVyIn19KX0pKGMpOwp2YXIgb2E9Yy5wanx8b2E7KGZ1bmN0aW9uKGMpe2MucWo9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYT1iLkl3O2E/YS5uYT9hLm5hLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3ZhciBiPSExLGY9IiI7YS5nZXRFcnJvciYmKGI9YS5nZXRFcnJvcigpKTtifHxhLmRldGFpbC5nZXRFcnJvciYmKGI9YS5kZXRhaWwuZ2V0RXJyb3IoKSk7Yi5nZXRFcnJvckNvZGUmJihmKz1iLmdldEVycm9yQ29kZSgpKTtiLmdldE1lc3NhZ2UmJihmKz1iLmdldE1lc3NhZ2UoKSk7Zi5pbmRleE9mJiYoMDw9Zi5pbmRleE9mKCIxMDA5Iil8fDA8PWYuaW5kZXhPZigiMzAzIil8fDA8PWYuaW5kZXhPZigiNDAzIikpPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLm0oKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksCjEwMCk6Yi5fYWRDb25maWcuYWRzRGlzYWJsZWR8fCh0aGlzLnUoImZyYW1ld29yayIpLHRoaXMubSgpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIHBhPWMucWp8fHBhOyhmdW5jdGlvbihjKXtjLnJqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5wbGF5ZXJNYW5hZ2VyJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzJiZ3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pe3ZhciBiPW5ldyBvYSh3aW5kb3cucGxheWVyTWFuYWdlci5nZXRBbGxQbGF5ZXJzKClbMF0pO3RoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IHBhKGIsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBxYT1jLnJqfHxxYTsobmV3IHFhKHIpKS5nKCk7CmM9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlyPXRoaXMuYVs2XTt0aGlzLmo9dGhpcy5hWzEwXX1jLm1sPWI7Yi5wcm90b3R5cGU9e2hyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuaXI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciByYT1jLm1sfHxyYSx5Yz1uZXcgcmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD15Yy5ocig0KTsoZnVuY3Rpb24oYyl7Yy5oaz10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3RoaXMuc2coKTt0aGlzLnVnKCk7dGhpcy5Ubz0hMX0sc2c6ZnVuY3Rpb24oKXt0aGlzLlpiPSExO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTsKYnx8KHRoaXMuWmI9ITApO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuVihiKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5aYil7dmFyIGI9dGhpcy5HYSgpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7YXx8KHRoaXMuWmI9ITApO3RoaXMuWihhKX19LExhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYobS5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYi5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlcmJigwLHRoaXMuVykoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiYKYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpfSksYi5vblRpbWUpYi5vblRpbWUoZnVuY3Rpb24oYSl7YS5kdXJhdGlvbiYmYS5wb3NpdGlvbiYmMT5hLmR1cmF0aW9uLWEucG9zaXRpb24mJnRoaXMuVyYmKDAsdGhpcy5XKSgpfS5iaW5kKHRoaXMpKX0sSWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5EZChhKX0uYmluZCh0aGlzKX0pO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuRGQoYSl9LmJpbmQodGhpcykpfSxEZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpOwphLmdldFBvc2l0aW9uKCk7Im1pZCI9PWIuYWRwb3NpdGlvbiYmYS5nZXRQb3NpdGlvbiYmMzA8YS5nZXRQb3NpdGlvbigpJiYzMDxhLmdldER1cmF0aW9uKCktYS5nZXRQb3NpdGlvbigpJiZ0aGlzLkplJiYoMCx0aGlzLkplKSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXI7aWYoIWIuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9Yi5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO3JldHVybiBiLmdldFN0YXRlJiYicGF1c2VkIj09Yi5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldEZ1bGxzY3JlZW4mJgpiLmdldEZ1bGxzY3JlZW4oKSYmYi5zZXRGdWxsc2NyZWVuKCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYT10aGlzLnBsYXllcjthLmdldE11dGUmJmEuZ2V0TXV0ZSgpJiYoYj0hMCk7cmV0dXJuIGJ9LHBlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9Yi5nZXRWb2x1bWUoKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgc2E9Yy5oa3x8c2E7KGZ1bmN0aW9uKGMpe2MuZ2s9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sTTpmdW5jdGlvbigpe30scmE6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLk9jO3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMX0sZzpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuUGM9ITE7dGhpcy5YZD0xO3RoaXMuUWM9W107dGhpcy52Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksCmE9e307Yi5nZXRDb25maWcmJihhPWIuZ2V0Q29uZmlnKCksYS5hZHZlcnRpc2luZz8oYS5hZHZlcnRpc2luZy5zY2hlZHVsZSYmKGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzP2EuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZyYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCYmKHRoaXMuWGQ9YS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZHMudGFnLmxlbmd0aCx0aGlzLnZiPSEwKTooYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLnByZXJvbGwudGFnJiYodGhpcy52Yj0hMCksYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlJiZhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkYnJlYWtwcmUudGFnJiYodGhpcy52Yj0hMCkpKSxhLmFkdmVydGlzaW5nLnRhZyYmKHRoaXMudmI9ITApKTp0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpKTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENvbXBsZXRlJiYKYi5fZXZlbnRzLmFkQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZENvbXBsZXRlIik7dGhpcy5QYz0hMH0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ2xpY2smJmIuX2V2ZW50cy5hZENsaWNrLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRDbGljayIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uJiZiLl9ldmVudHMuYWRJbXByZXNzaW9uLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRJbXByZXNzaW9uIik7dGhpcy5OZSgpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRNZXRhJiZiLl9ldmVudHMuYWRNZXRhLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRNZXRhIil9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMuYWRTa2lwcGVkJiZiLl9ldmVudHMuYWRTa2lwcGVkLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMudygiYWRTa2lwcGVkIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZFRpbWUmJmIuX2V2ZW50cy5hZFRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy53KCJhZFRpbWUiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLm9uQWRFcnJvcihhKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLnRpbWUmJmIuX2V2ZW50cy50aW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuaWgmJgohdGhpcy51YSgpJiYodGhpcy52Yj8odGhpcy51KCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5tKCkpOih0aGlzLnUoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm0oITApKSl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0mJmIuX2V2ZW50cy5wbGF5bGlzdEl0ZW0ucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbigpe2lmKHRoaXMudWEoKSYmKHRoaXMucmEoKSx0aGlzLmdldFBsYXllcigpLlRvPSEwLG0uc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiYoYS52ZCgpLGEua2UoKSl9fS5iaW5kKHRoaXMpfSk7aWYoYi5vbkFkQ29tcGxldGUpYi5vbkFkQ29tcGxldGUoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRDb21wbGV0ZSIpO3RoaXMuUGM9ITB9LmJpbmQodGhpcykpO2lmKGIub25BZEltcHJlc3Npb24pYi5vbkFkSW1wcmVzc2lvbihmdW5jdGlvbigpe3RoaXMudygib25BZEltcHJlc3Npb24iKTsKdGhpcy5OZSgpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRQbGF5KWIub25BZFBsYXkoZnVuY3Rpb24oKXt0aGlzLncoIm9uQWRQbGF5Iil9LmJpbmQodGhpcykpO2lmKGIub25BZFRpbWUpYi5vbkFkVGltZShmdW5jdGlvbigpe3RoaXMudygib25BZFRpbWUiKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkRXJyb3IpYi5vbkFkRXJyb3IoZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcykpO2lmKGIub25UaW1lKWIub25UaW1lKGZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5paCYmIXRoaXMudWEoKSYmKHRoaXMudmI/KHRoaXMudSgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubSgpKToodGhpcy51KCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5tKCEwKSkpfS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGIpe3ZhciBhPWIudGFnOy0xPT10aGlzLlFjLmluZGV4T2YoYSkmJgp0aGlzLlFjLnB1c2goYSk7IjEwMSI9PWIuY29kZXx8IjEwMDEiPT1iLmNvZGU/KHRoaXMudygpLHRoaXMudGEoKSk6OTAwPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiZW1wdHkiKT90aGlzLncoImVtcHR5Iik6MzAzPT1iLmNvZGUmJjA8Yi5tZXNzYWdlLmluZGV4T2YoIk5vIEFkcyBWQVNUIHJlc3BvbnNlIGFmdGVyIG9uZSBvciBtb3JlIFdyYXBwZXJzIik/dGhpcy53KCJlbXB0eSIpOih0aGlzLnUoImFkZXJyb3IiLGIuY29kZSksdGhpcy5RYy5sZW5ndGg+PXRoaXMuWGQmJnRoaXMubSgpKX0sY3M6ZnVuY3Rpb24oYil7dGhpcy5vKCJKVzogIitiLnR5cGUpfSxtOmZ1bmN0aW9uKGIpe2I/dGhpcy5uZT90aGlzLm5lKys6dGhpcy5uZT0xOnRoaXMubWU/dGhpcy5tZSsrOnRoaXMubWU9MTt2YXIgYT10aGlzLmdldFBsYXllcigpO2UuSmgoYS52aWRlb1RhZyk/YS5aYj90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLlBjfHx0aGlzLmlzUGxheWluZz8KKHRoaXMubWU+dGhpcy5uZSYmKGI9ITEpLHRoaXMuRyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oYil9LmJpbmQodGhpcyksNTApOihhLnNnKCksYS51ZygpLGEuWmJ8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDIwKSl9fSl9KShjKTt2YXIgdGE9Yy5na3x8dGE7KGZ1bmN0aW9uKGMpe2MuaWs9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtpZigiWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4IiE9dGhpcy5ycSgpfHwhYi5hdXRob3JpdHl8fCFiLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5KXt2YXIgYT0KZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiandwbGF5ZXIiKTtpZighd2luZG93Lmp3cGxheWVyfHwhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fCJBIiE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCkubm9kZU5hbWUpaWYod2luZG93Lmp3cGxheWVyJiZkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8aCYmaCgpLmlkKXtiPVtdO2lmKDE8YS5sZW5ndGgpZm9yKGg9MDtoPGEubGVuZ3RoO2grKyliLnB1c2goYVtoXS5nZXRBdHRyaWJ1dGUoImlkIikpO2Vsc2UgYi5wdXNoKGp3cGxheWVyKCkuaWQpO2p3cGxheWVyKCk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IHNhKHdpbmRvdy5qd3BsYXllcihiW2FdKSk7dGhpcy5OKGgpfHx0aGlzLkVyKGgpfHwodGhpcy5SKGgpLGg9bmV3IHRhKGgsdGhpcy5JKSxoLk0oKSxoLmcoKSl9fXRoaXMuVCgpfX0sVHc6ZnVuY3Rpb24oKXtyZXR1cm4iWVdScGRHbHZiaTVyWldsdVpYWnBaR1Z2ZDJWeVluVnVaejB4In0sCnJxOmZ1bmN0aW9uKCl7dmFyIGI9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS54YihiLmFuY2hvcil9fSl9KShjKTt2YXIgdWE9Yy5pa3x8dWEsdmE9bmV3IHVhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVqPXRoaXMuYVsyXTt0aGlzLnh1PXRoaXMuYVs2XTt0aGlzLnprPXRoaXMuYVs1XTt0aGlzLmo9dGhpcy5hWzJdfWMuVW49YjtiLnByb3RvdHlwZT17ZGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmVqOnRoaXMud3UoYSl9LHd1OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54dTp0aGlzLnlrKGEpfSx5azpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuems6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB3YT1jLlVufHx3YSx6Yz1uZXcgd2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9emMuZGooNCk7KGZ1bmN0aW9uKGMpe2MuR209dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiKXt2YXIgYT1iLmVsXzthfHwoYT1iLmVsKCkpO2E/KHRoaXMuVihhKSwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGI/dGhpcy5aKGIpOnRoaXMuY2EoKSk6dGhpcy5jYSgpfWVsc2UgdGhpcy5jYSgpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInZpZGVvanMifSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMuSmQoYil9LmJpbmQodGhpcykpfSxKZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0KYi5jdXJyZW50VGltZSgpLGI9Yi5kdXJhdGlvbigpO2EmJjA8YSYmYiYmMDxiJiZhPj1iLTImJnRoaXMuVyYmdGhpcy5XKCl9LHllOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImRhdGEteC1zZXR1cCIpO2lmKGIpdHJ5e3ZhciBhPUpTT04ucGFyc2UoYik7aWYoYS5oYXNPd25Qcm9wZXJ0eSgieC1hdXRvcGxheSIpJiYhYVsieC1hdXRvcGxheSJdKXJldHVybiExfWNhdGNoKGgpe31iPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIuYXV0b3BsYXkmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmF1dG9wbGF5P2IuYXV0b3BsYXkoKTohMX0scWE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXIubXV0ZWQmJnRoaXMucGxheWVyLm11dGVkKCl9LEphOmZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpO3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZWQoKT8hMTohMH0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIuaXNGdWxsc2NyZWVuO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChoKXthPSExfWEmJmIuZXhpdEZ1bGxzY3JlZW4oKX0sY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB4YT1jLkdtfHx4YTsoZnVuY3Rpb24oYyl7Yy5GbT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmVhPXRoaXMuRGM9dGhpcy55YT10aGlzLlVjPSExO3RoaXMudmg9ZS5HYigxMCk7dGhpcy5aaD0hMDt0aGlzLnJjPXRoaXMuUWc9ITE7dGhpcy54cyhiLmdldFJhd1BsYXllcigpKXx8KHRoaXMubGgoKSx0aGlzLkNvKCksdGhpcy5xYigpKX0seHM6ZnVuY3Rpb24oYil7cmV0dXJuIGUuemEoInQtb25saW5lLmRlIik/CiExPT09Yi5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGx4OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5qYSgpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5YLCI7Iix0eXBlb2YgYi5YLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLlg/Yi5YLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsYi5YP3R5cGVvZiBiLlguc3RhdGU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYToiLCI7IixiLmltYSwiOyIsdHlwZW9mIGIuaW1hLCI7IiwicGxheWVyLmltYTM6IiwiOyIsYi5KLCI7Iix0eXBlb2YgYi5KLCI7IiwicGxheWVyLmltYS5hZGRFdmVudExpc3RlbmVyOiIsIjsiLGIuaW1hP2IuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoKInVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLko/Yi5KLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouRWE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5FYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXIoKToiLCI7IixiLmltYSYmYi5pbWEuRWE/Yi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLGIuaW1hJiZiLmltYS5FYT90eXBlb2YgYi5pbWEuRWEoKToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5nZXRBZHNNYW5hZ2VyKCk6IiwKIjsiLGIuSiYmYi5KLkVhP2IuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5KJiZiLkouRWE/dHlwZW9mIGIuSi5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkouVGQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5UZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLl9hZHNNYW5hZ2VyOiIsIjsiLGIuaW1hP2IuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLlVkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLl9hZHNNYW5hZ2VyOiIsIjsiLGIuSj9iLkouVWQ6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5VZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc0xvYWRlcjoiLCI7IiwKYi5pbWE/Yi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuSj9iLkoubmE6InVuZGVmaW5lZFgiLCI7IixiLko/dHlwZW9mIGIuSi5uYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuYmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTWFuYWdlcjoiLCI7IixiLko/Yi5KLmJlOiJ1bmRlZmluZWRYIiwiOyIsYi5KP3R5cGVvZiBiLkouYmU6InVuZGVmaW5lZFgiLCI7IiwiRE9ORSIsdGhpcy52aCl9LHliOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmltYTMmJih0aGlzLmltYT1iLmltYTMpO2lmKGIuaW1hKXt0aGlzLmltYT1iLmltYTt0cnl7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaW1hJiYKdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5uYSl7dmFyIGI9dGhpcy55YigpO2ImJihiLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5hZHNMb2FkZXIpLGIuX2Fkc0xvYWRlciYmKHRoaXMubmE9Yi5fYWRzTG9hZGVyKSxiLmdldEFkc0xvYWRlciYmKHRoaXMubmE9Yi5nZXRBZHNMb2FkZXIpLGIuY29udHJvbGxlciYmYi5jb250cm9sbGVyLnNka0ltcGwmJmIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlciYmKHRoaXMubmE9Yi5jb250cm9sbGVyLnNka0ltcGwuYWRzTG9hZGVyKSl9cmV0dXJuIHRoaXMubmF9LEVnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuRGMpe3ZhciBiPQp0aGlzLnliKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuRGM9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLkRjPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuRGN9LENyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuUGcpe3ZhciBiPXRoaXMueWIoKSxhPXRoaXMuQXIoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJih0aGlzLlBnPSEwKX1yZXR1cm4gdGhpcy5QZ30sQXI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlVjJiZiLmFkcyYmKGIuYWRzLnN0YXRlfHxiLmFkcy5fc3RhdGUpJiYodGhpcy5VYz0hMCk7cmV0dXJuIHRoaXMuVWN9LHFiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5WYigpO2lmKGIpe3ZhciBhPSJhZEVycm9yIixoPSJhZHNNYW5hZ2VyTG9hZGVkIixkPSJsb2ciO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoaD1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYoZD1nb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cpOyJmdW5jdGlvbiIhPT10eXBlb2YgYi5hZGRFdmVudExpc3RlbmVyPwp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSwhMCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihoLGZ1bmN0aW9uKCl7dGhpcy5SdCgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LFJ0OmZ1bmN0aW9uKCl7dGhpcy5yYz0hMDt2YXIgYj10aGlzLkVnKCk7aWYoYnx8dGhpcy51YSgpKXt2YXIgYT0iYWRFcnJvciIsaD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmCmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGg9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSk7dmFyIGQ9IiI7ZS5TYSgpJiYoZD0iTV8iKTtiLmFkZEV2ZW50TGlzdGVuZXIoInN0YXJ0IixmdW5jdGlvbigpe2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpOwpiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2lmKGUuemEoImNoaXAuZGUiKSl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsibWlkcG9pbnQiLCIiLCEwKTtlLnRyYWNrKCJzdGF0c19jdXN0X2RvdWJsZXBsYXkiLCFhLnBhdXNlZCgpLCEwKX19LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnNjPSEwO2UuemEoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsCmZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5zYz0hMDtlLnphKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuc2N8fCh0aGlzLnUoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLmZhKCksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5xYigpfS5iaW5kKHRoaXMpLDIwKX0sU3c6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLmtnJiZiLmFkcyYmKHRoaXMua2c9Yi5hZHMpO3JldHVybiB0aGlzLmtnfSwKQ286ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Iub24oImFkc2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLnJhKCk7dGhpcy5mYSghMCk7dGhpcy51KCJ0cmlnZ2VyIiwiSE9NQUQiKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2Vycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTNhZGVycm9yIixmdW5jdGlvbihhKXt0aGlzLmdhKGEpO3RoaXMuZmEoKTt0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7dGhpcy5mYSgpO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKX0uYmluZCh0aGlzKSk7Yi5vbigiYWRzLWZpcnN0LXF1YXJ0aWxlIiwKZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLk5lKCl9LmJpbmQodGhpcykpfSxkZDpmdW5jdGlvbigpe3ZhciBiPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlkpaG9tYWRVdGlscy5SYSYmKGI9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn19Y2F0Y2goYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRkKCl9LmJpbmQodGhpcyksNTApO3JldHVybn1iJiYoKGI9dGhpcy5FZygpKSYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpLDUwKSl9LGxoOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZygpJiYwPGIuY3VycmVudFRpbWUoKSlpZih0aGlzLkNyKCkpe3ZhciBhPXRoaXMueWIoKSxoPXRoaXMuVmIoKTthJiZoJiYodGhpcy55YigpLHRoaXMuVmIoKSx0aGlzLnJjfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJjP3RoaXMudygpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy55YigpfWVsc2UgdGhpcy5RZz93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPXRoaXMueWIoKSxiPXRoaXMuVmIoKTthJiYhYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQV9BRFNMT0FERVIiKSx0aGlzLmZhKCkpOih0aGlzLmZhKCEwKSx0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy5RZz0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMudWEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxoKCl9LmJpbmQodGhpcyksNTApfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwKIWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChoPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlM9YSxiLnUoImFkZXJyb3IiLGEpKX1yZXR1cm4gaH1iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5CYSgpO2JyZWFrfX0sRG86ZnVuY3Rpb24oKXt0aGlzLndjfHwodGhpcy53Yz0idW5rbm93biIpO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5hZHMpe2lmKHRoaXMud2MhPWIuYWRzLnN0YXRlJiYodGhpcy53Yz1iLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy53Yyl7dGhpcy53KCJhZC1wbGF5YmFjayIpO3JldHVybn19ZWxzZSB0aGlzLndjPSJuby1hZHMiO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5EbygpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sQmE6ZnVuY3Rpb24oKXswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uKS5pbmRleE9mKCJzdGVybi5kZSIpJiYxMDA5PT10aGlzLlM/KHRoaXMuZWE9ITAsdGhpcy5tKCEwKSk6KHRoaXMuZWE9ITAsdGhpcy53KCJlbXB0eSB2YXN0IikpfSxmYTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWE/Cih0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubShiKX0uYmluZCh0aGlzKSwxMDApfSxtOmZ1bmN0aW9uKGIpe3RoaXMudWEoKXx8KGJ8fCh0aGlzLlpoPSExKSx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuRyh0aGlzLlpoLGZ1bmN0aW9uKCl7dGhpcy5kZCgpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSkpfSxJbzpmdW5jdGlvbigpe3RoaXMuYXh8fCgxMDx0aGlzLlF2Pyh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmZhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuUXYrKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5XdCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5JbygpfS5iaW5kKHRoaXMpLDUwKSkpfSxXdDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi52cEV2ZW50JiYKIXRoaXMuUnYpe3RoaXMuUnY9ITA7dmFyIGE9IiI7Yi52cEV2ZW50LnJhbmRvbVRlc3QmJihhPSIiKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLWVycm9yIithLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIiwidnA6YWRzLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5mYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrCmEsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX19fSl9KShjKTt2YXIgeWE9Yy5GbXx8eWE7KGZ1bmN0aW9uKGMpe2MuSG09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMuS2god2luZG93KTtmb3IodmFyIGg9MDtoPGIubGVuZ3RoO2grKyl0cnl7YT1hfHx0aGlzLktoKGJbaF0pfWNhdGNoKGQpe310aGlzLlQoKX19LEtoOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPAplLnNlKGEpKXtiPWE7Zm9yKHZhciBoIGluIGIpYi5oYXNPd25Qcm9wZXJ0eShoKSYmKGE9bmV3IHhhKGJbaF0pLGEubWF8fHRoaXMuTihhKXx8ITE9PT1hLmdldFJhd1BsYXllcigpLmlzUmVhZHlffHwodGhpcy5SKGEpLChuZXcgeWEoYSx0aGlzLkkpKS5nKCkpKTtyZXR1cm4hMH1yZXR1cm4hMX0sVDpmdW5jdGlvbigpe3RoaXMuS2I9d2luZG93LnNldFRpbWVvdXQodGhpcy5nLmJpbmQodGhpcyksdGhpcy5IYyl9fSl9KShjKTt2YXIgemE9Yy5IbXx8emEsQWE9bmV3IHphKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRrPXRoaXMuYVs0XTt0aGlzLmZrPXRoaXMuYVs0XTt0aGlzLnF3PXRoaXMuYVsxXTt0aGlzLnZsPXRoaXMuYVsyXTt0aGlzLnZ1PXRoaXMuYVs5XTt0aGlzLmpsPXRoaXMuYVs0XTt0aGlzLkJ1PXRoaXMuYVs1XTt0aGlzLm9qPXRoaXMuYVs0XTt0aGlzLkNqPQp0aGlzLmFbNF07dGhpcy5nbT10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs3XX1jLlppPWI7Yi5wcm90b3R5cGU9e3NrOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy50azp0aGlzLmVrKGEpfSxlazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZms6dGhpcy5wdyhhKX0scHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnF3OnRoaXMudWwoYSl9LHVsOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy52bDp0aGlzLnV1KGEpfSx1dTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnU6dGhpcy5pbChhKX0saWw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmpsOnRoaXMuQXUoYSl9LEF1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CdTp0aGlzLm5qKGEpfSxuajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2o6dGhpcy5CaihhKX0sQmo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkNqOnRoaXMuZm0oYSl9LGZtOmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuZ206dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgQmE9Yy5aaXx8QmEsQWM9bmV3IEJhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QWMuc2soNCk7KGZ1bmN0aW9uKGMpe2MuRWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5QZT0wO3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLnBsYXllckNvbnRhaW5lcjtpZighYSYmKGIucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UuaWQmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIucGxheWVySW5zdGFuY2UuaWQpKSYmKGE9Yi5wYXJlbnROb2RlKSwhYSkpe3RoaXMuY2EoKTtyZXR1cm59dGhpcy5WKGEpOyhiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwKKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2I/dGhpcy5aKGIpOnRoaXMuY2EoKX0sd3Q6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5CYixoPXRoaXMuamEoKSxkPSIiO2IubWVtbyYmKGQ9Yi5tZW1vLnZpZGVvaWQpO2QmJmEmJmEuWWImJigwPD1oLmluZGV4T2YoZCl8fGEudmQoKSl9LHBhdXNlOmZ1bmN0aW9uKGIpe2J8fCh0aGlzLlBlPTApO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBhdXNlPyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksYi5wbGF5ZXJJbnN0YW5jZS5wYXVzZSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBhdXNlIiwiKiIpLHdpbmRvdy5vdlZpZGVvLnN0b3BQbGF5YmFjaygpKX0sSmE6ZnVuY3Rpb24oKXt0aGlzLlBlKys7aWYoMTA8dGhpcy5QZSlyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpOwpyZXR1cm4hMH0scGxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7Yi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5wbGF5Pyh3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBsYXkoKSk6d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlc3VtZVBsYXliYWNrJiYod2luZG93LnBvc3RNZXNzYWdlKCJob21hZHBsYXkiLCIqIiksd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2soKSl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuITE9PT1iLnBsYXllckluc3RhbmNlLnBhdXNlZD8hMDohMD09PWIucGxheWVySW5zdGFuY2UucGF1c2VkPyExOmIuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTsKaWYod2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKXJldHVybiB3aW5kb3cub3ZWaWRlby5nZXRDdXJyZW50VGltZSgpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LExhOmZ1bmN0aW9uKCl7fSxKZDpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfX0pfSkoYyk7CnZhciBDYT1jLkVsfHxDYTsoZnVuY3Rpb24oYyl7Yy5EbD12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe2lmKCF0aGlzLm9lKWlmKHRoaXMuQ2J8fCh0aGlzLkNiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuQ2IrKywxNTx0aGlzLkNiKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm0oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMub2U9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSwKZnVuY3Rpb24oYSl7dGhpcy5nYShhKTt0aGlzLmVhfHwodGhpcy51KCJhZGVycm9yIix0aGlzLlMpLHRoaXMubSgpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueWEoKX0uYmluZCh0aGlzKSwxMCl9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGg9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpaD0hMDtofHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGg9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBofWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYKImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBoPWIuZ2V0RXJyb3IoKTtpZihoLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGguZ2V0RXJyb3JDb2RlJiZhKGguZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlM9dGhpcy5TfHwhMTt0aGlzLnlhKCk7dmFyIGE9d2luZG93Lm92VmlkZW87YXx8KGE9d2luZG93Lm92LnZpZGVvLlBsYXllcik7YSYmYS5yZWdpc3RlckV2ZW50JiYhdGhpcy5VcD8oYS5yZWdpc3RlckV2ZW50KGEuT05fUExBWUVSX0RFU1RST1lFRCwKZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9uX1BMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLlBMQVlFUl9ERVNUUk9ZRUQsZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcykpLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy51KCJhZGVycm9yIix0aGlzLlMpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSx0aGlzLlVwPSEwLGEucmVnaXN0ZXJFdmVudChhLk9OX1BMQVlFUl9TVE9QUEVELGZ1bmN0aW9uKGEpe2Iud3QoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIERhPWMuRGx8fERhOyhmdW5jdGlvbihjKXtjLkZsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMuVGE9CjE1MDA7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9W107d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplciYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXImJjA8d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllcik7d2luZG93Lm92JiZ3aW5kb3cub3YudmlkZW8mJndpbmRvdy5vdi52aWRlby5QbGF5ZXImJndpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIubGVuZ3RoJiYoYj13aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyKTtpZigwPApiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGg9bmV3IENhKGJbYV0pO2gubWF8fHRoaXMuTihoKXx8KHRoaXMuUihoKSwobmV3IERhKGgsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciBFYT1jLkZsfHxFYSxGYT1uZXcgRWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuRXA9dGhpcy5hWzhdO3RoaXMuYm49dGhpcy5hWzhdO3RoaXMub3A9dGhpcy5hWzFdO3RoaXMucnQ9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbOV19Yy5FbT1iO2IucHJvdG90eXBlPXtEcDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXA6dGhpcy5hbihhKX0sYW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmJuOnRoaXMubnAoYSl9LG5wOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5vcDp0aGlzLnF0KGEpfSxxdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLnJ0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgR2E9Yy5FbXx8R2EsQmM9bmV3IEdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9QmMuRHAoNCk7KGZ1bmN0aW9uKGMpe2MuYWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWUuQ2coYiwiZWxlbWVudElEIik7c3dpdGNoKGIuZWxlbWVudFBhdGgpe2Nhc2UgInVwIjphLnBhcmVudE5vZGUmJihhPWEucGFyZW50Tm9kZSl9dGhpcy55dD1iLnBvc2l0aW9uaW5nO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guc3R5bGUud2lkdGg9Yi53aWR0aDtoLnN0eWxlLm1pbldpZHRoPWIud2lkdGg7aC5zdHlsZS5tYXhXaWR0aD1iLndpZHRoO2guc3R5bGUuaGVpZ2h0PQpiLmhlaWdodDtoLnN0eWxlLm1pbkhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1heEhlaWdodD1iLmhlaWdodDtoLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO2guc3R5bGUubWFyZ2luUmlnaHQ9ImF1dG8iO3N3aXRjaCh0aGlzLnl0KXtjYXNlICJiZWZvcmUiOmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaCxhKTticmVhaztjYXNlICJhZnRlciI6YS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShoLGEubmV4dFNpYmxpbmcpO2JyZWFrO2Nhc2UgImluc2lkZSI6YS5hcHBlbmRDaGlsZChoKTticmVhaztkZWZhdWx0OmEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoaCxhKX10aGlzLlYoaCk7dGhpcy5aKGgpO3RoaXMuZ2Q9aH0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5nZCl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuITB9LEhvOmZ1bmN0aW9uKCl7ZS5XZyh0aGlzLmdkKTtlLnplKHRoaXMuZ2QpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IbygpfS5iaW5kKHRoaXMpLAo1MCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iaW5yZWFkIn0sRGU6ZnVuY3Rpb24oKXtyZXR1cm4hMH19KX0pKGMpO3ZhciBIYT1jLmFrfHxIYTsoZnVuY3Rpb24oYyl7Yy4kaj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy51KCJleHRlcm5hbCIpO3RoaXMuRyghMCl9fSl9KShjKTt2YXIgSWE9Yy4kanx8SWE7KGZ1bmN0aW9uKGMpe2MuYms9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5UYT0xNTAwO3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKG0mJm0uaW5yZWFkKXt2YXIgYj1tLmlucmVhZCxhPWUuQ2coYiwiZWxlbWVudElEIik7aWYoZS5XZyhhKSYmKGI9bmV3IEhhKGIpLCF0aGlzLk4oYikpKXt0aGlzLlIoYik7KG5ldyBJYShiLHRoaXMuSSkpLmcoKTtyZXR1cm59dGhpcy5LYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5LYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLAoxMDApfX0pfSkoYyk7dmFyIEphPWMuYmt8fEphLEthPW5ldyBKYShyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Xcz10aGlzLmFbMTBdO3RoaXMuaW09dGhpcy5hWzVdO3RoaXMuUGk9dGhpcy5hWzFdO3RoaXMuJHQ9dGhpcy5hWzNdO3RoaXMubW89dGhpcy5hWzRdO3RoaXMuaj10aGlzLmFbN119Yy56bz1iO2IucHJvdG90eXBlPXtWczpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuV3M6dGhpcy5obShhKX0saG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmltOnRoaXMuT2koYSl9LE9pOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5QaTp0aGlzLlp0KGEpfSxadDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuJHQ6dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLmo6YX19fSkoYyk7dmFyIExhPWMuem98fExhLENjPW5ldyBMYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPUNjLlZzKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5Iaj1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxtdTpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LGduOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuSGp8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxoLGQsZil7dGhpcy5lYj1hO3RoaXMueGc9CnRoaXMuaGk9ITE7dGhpcy5taD1kO3RoaXMuTGg9ITE7InN0cmluZyI9PT10eXBlb2YgYSYmKHRoaXMuZWI9bmV3IHooYSkpO3ZhciBjPXRoaXMuc2I9bmV3IFhNTEh0dHBSZXF1ZXN0O2Mub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7IWh8fDQhPWMucmVhZHlTdGF0ZXx8MjAwIT1jLnN0YXR1cyYmMjAxIT1jLnN0YXR1c3x8aChjKTtpZihkJiY0PT1jLnJlYWR5U3RhdGUmJjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJmwmJmwuQ2UodGhpcy5lYi51cmwpJiZsLktkKXt2YXIgZT1uZXcgeihhLnVybCk7ZS5tdSgiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoZSxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChoKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxsLmthKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LApmdW5jdGlvbigpe2wua2EoInJlcXVlc3RfZmFpbGVkIil9KSkubG9hZCgpfWYmJjQhPWMucmVhZHlTdGF0ZSYmZihjKX0uYmluZCh0aGlzKX1jLklqPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmViLmRhdGE7aWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLnhnJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5MaD90aGlzLnNiLm9wZW4odGhpcy5lYi5tZXRob2QsdGhpcy5lYi51cmwsITEpOnRoaXMuc2Iub3Blbih0aGlzLmViLm1ldGhvZCx0aGlzLmViLnVybCwhMCksdGhpcy5oaXx8KHRoaXMuc2Iud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLnNiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLAphWyJYLUhvbWFkLVBvc3QiXSYmdGhpcy5zYi5zZXRSZXF1ZXN0SGVhZGVyKCJYLUhvbWFkLVBvc3QiLCJ0cnVlIiksdGhpcy5zYi5zZW5kKGEpfWNhdGNoKGYpe2wmJmwuQ2UodGhpcy5lYi51cmwpP2wuS2Q/bC5rYSgicmVxdWVzdF9mYWlsZWQiKTplLnRyYWNrKCJjaGVjayIsInJlcXVlc3RfZmFpbGVkIiwhMCk6bC5DZSh0aGlzLmViLnVybCksdGhpcy5taCYmdGhpcy5taCgpfXJldHVybiB0aGlzLnNifX19KShjKTt2YXIgTWE9Yy5Janx8TWE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLlJhPSExO3RoaXMudWM9IiI7dGhpcy5jZT10aGlzLnRjPXRoaXMud2I9bnVsbDt0aGlzLmdwPXRoaXMuSWI9dGhpcy5kaD0hMTt0aGlzLkhhPSIiO3RoaXMuWWc9ITE7dGhpcy5EYT10aGlzLm1kPSIiO3RoaXMuVWc9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuVmU9ITE7dGhpcy5BYT1bXTt0aGlzLktnPXRoaXMuY2M9IiI7dGhpcy5sZT0hMTt0aGlzLm1mPTA7dGhpcy5DZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjsKdGhpcy5BZj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX0JMT0NLRUQiO3RoaXMuT2I9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9OT0JMT0NLRVIiO3RoaXMubGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMuQmY9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLmVjPSIiO3RoaXMuZmM9W107dGhpcy5nYz1bXTt0aGlzLklkPVtdO3RoaXMuZGM9IiI7dGhpcy5uZj0wO3RoaXMudmlkZW9wbGF6YT17fTt0aGlzLkNjPSExO3RoaXMuSm89dGhpcy5NZD1udWxsO3RoaXMuR2g9dGhpcy5qYz10aGlzLnBnPXRoaXMucWY9dGhpcy5LZD10aGlzLmZlPXRoaXMuVmQ9ITE7dGhpcy5oYj17Z2xvYmFsOiExLGNsaWVudDohMSxjdXN0b21lcjohMX07dGhpcy5uZD0wO3RoaXMuTWc9ITE7dGhpcy5MZz0xRTM7dGhpcy5XYz0hMTt0aGlzLk9hPTFFMzt0aGlzLktmPSIifWMuSmo9YjtiLnByb3RvdHlwZT17Z2V0Q29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJue2lzQWN0aXZlOnRoaXMuUmEsCmFkdGFncGFyYW1ldGVyOnRoaXMudWMsYWR0YWdtb2RpZmllcjp0aGlzLndiLGFkdGFnbW9kaWZpZXJBZHY6dGhpcy50YyxhZHRhZ3JlZ2V4OnRoaXMuY2UsYml0cmF0ZTp0aGlzLk9hLGpzcG9wdXBzOnRoaXMuZGgsc2lkZWxvYWRzOnRoaXMuSWIsZGlzYWJsZXRlc3RzOnRoaXMuZ3AsaG9tYWRBbGlhczp0aGlzLkhhLGlzSW5pdGlhbGl6ZWQ6dGhpcy5ZZyxnbG9iYWxDb25maWc6dGhpcy5tZCxjbGllbnRDb25maWc6dGhpcy5EYSxpc0VuYWJsZWQ6dGhpcy5pc0VuYWJsZWQsaXNWZXJpZmllZDp0aGlzLlksaXNCbG9ja2VkOnRoaXMuVWcsc2VydmVyOnRoaXMuQWEsc3ZtQ29uZmlnOnRoaXMuY2MsaG9tYWRBZHBhdGg6dGhpcy5LZyxkaXNhYmxlQ29va2llVGVzdDp0aGlzLmxlLHRlc3RDb29raWVBdHRlbXB0czp0aGlzLm1mLEhPTUFEX1ZFUklGSUVEOnRoaXMuQ2YsSE9NQURfQkxPQ0tFRDp0aGlzLkFmLEhPTUFEX05PQkxPQ0tFUjp0aGlzLk9iLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLmxjLApIT01BRF9DT09LSUVCTE9DS0VSOnRoaXMuQmYsdGVzdEhpZGU6dGhpcy5lYyx0ZXN0VGFnczp0aGlzLmZjLHRlc3RUYWdzSlM6dGhpcy5nYyx0ZXN0VGFnc1hIUjp0aGlzLklkLHRlc3RDb29raWU6dGhpcy5kYyx0aHJvdHRsZTp0aGlzLm5mLHZpZGVvcGxhemE6dGhpcy52aWRlb3BsYXphLGhvbWFkVGVzdGVkOnRoaXMuQ2MsY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2s6dGhpcy5KbyxhZEJsb2NrZXJEZXRlY3RlZDp0aGlzLlZkLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy5mZSx1c2VTdHJpY3RDaGVja3M6dGhpcy5LZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5xZixjb25maWdGYWlsdXJlczp0aGlzLmhiLHNpdGVDb25maWc6dGhpcy5iYixzZXJ2ZXJJZDp0aGlzLkRoLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5qYix2cGFpZDp0aGlzLmpjLHNraXBBbGxvd2VkOnRoaXMuR2gsdm1hcHM6dGhpcy5laSxhbHRlcm5hdGVfY2xpY2t0aHJvdWdoOnRoaXMuV2MsYWRGYWxsYmFja1VSTDp0aGlzLktmfX0sCk9xOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYjtmb3IoYiBpbiB0aGlzLmhiKSJib29sZWFuIj09dHlwZW9mIHRoaXMuaGJbYl0mJjE9PXRoaXMuaGJbYl0mJihhPSEwKTtyZXR1cm4gYX0sJGU6ZnVuY3Rpb24oYSl7dGhpcy5oYlthXT0hMH0sc3E6ZnVuY3Rpb24oKXt2YXIgYT1bXSxiO2ZvcihiIGluIHRoaXMuaGIpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5oYltiXSYmMT09dGhpcy5oYltiXSYmYS5wdXNoKGIpO3JldHVybiBhfSxIZDpmdW5jdGlvbihhKXthPWF8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gYTthPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLApkb2N1bWVudC5VUkwpO2E9YS5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGE9ZS5pbyhhKX0seGE6ZnVuY3Rpb24oYSxiLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixnPSIiO2lmKCF0aGlzLlJhJiYhYilyZXR1cm4gbmV3IHooYSk7Zj10aGlzLkJlKGEpO2M9dGhpcy52YShhKTtmPyh0aGlzLnBkKCk/ZT1hOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsZz1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLnpkKCksZz1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMudWN8fHRoaXMud2J8fHRoaXMudGN8fHRoaXMuY2UpJiYoZz10aGlzLmtzKGcpKTthPW5ldyB6KGUpO2EudXJsPWU7ZT0iIjtlPWY/Yy5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMudXEoYy5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1lO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PQpnO2EuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnhiKGcpO2EubWV0aG9kPSJQT1NUIjtyZXR1cm4gYX0sQmU6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYSkpJiYoZFsyXXx8ZFs1XSk/Yj0hMDp0aGlzLnBkKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYSkpJiZkWzRdJiYoYj0hMCkpO3JldHVybiBifSxwZDpmdW5jdGlvbigpe3ZhciBhPSExLGI9IiI7dGhpcy5BYSYmdGhpcy5BYS5sZW5ndGgmJjA8dGhpcy5BYS5sZW5ndGgmJihiPXRoaXMuQWFbMF0sYj1iLnJlcGxhY2UoImh0dHBzOi8vIiwiIiksYj1iLnJlcGxhY2UoImh0dHA6Ly8iLCIiKSxiPWIucmVwbGFjZSgiLy8iLCIiKSxhPShhPQpiLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LENlOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuQmUoYSk7cmV0dXJuIGJ9LHVxOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5IYSYmMDx0aGlzLkhhLmxlbmd0aClyZXR1cm4gdGhpcy5IYTtmb3IoZCBpbiB0aGlzLkhhKWlmKGI9dGhpcy5IYVtkXSxiLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYi51cmw9PT1hKXJldHVybiBiLk53O3JldHVybiJub25lIn0sb2Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5BYVt0aGlzLkRoXX0semQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLm9kKCksYj10aGlzLkZoKChuZXcgRGF0ZSkuZ2V0VGltZSgpKyIiKSxkPSIxYWJjZGYiLnNwbGl0KCIiKTtyZXR1cm4gYS5yZXBsYWNlKCJbaGFzaF0iLApiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxqaDpmdW5jdGlvbihhLGIsZCl7YT0hMTtiPSIiO2lmKGQuZXZhbCl0cnl7Yj1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2E9ITB9ZWxzZSBhPSEwO2EmJiJLRUVQIiE9PWQuZmFsbGJhY2smJihiPWQuZmFsbGJhY2spO3JldHVybiBifSxqczpmdW5jdGlvbihhLGIpe3ZhciBkPWUudmEoYSksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYil7aWYoYltjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgZz1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEg9MDtIPGcubGVuZ3RoO0grKyl7dmFyIGs9Z1tIXS5zcGxpdCgiPSIpO2Zba1swXV09a1sxXX1mb3IodmFyIGwgaW4gYltjXS5zdWJ2YWx1ZXMpZltsXT10aGlzLmpoKGZbbF0sbCxiW2NdLnN1YnZhbHVlc1tsXSk7Zz1bXTtmb3IobCBpbiBmKWcucHVzaChsKyI9IitmW2xdKTtmPWc9ZW5jb2RlVVJJQ29tcG9uZW50KGcuam9pbigiJiIpKX1lbHNlIGY9CnRoaXMuamgoZC5xdWVyeUtleVtjXSxjLGJbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxrczpmdW5jdGlvbihhKXt0aGlzLnVjJiYoYSs9dGhpcy51Yyk7aWYodGhpcy53Yilmb3IodmFyIGIgaW4gdGhpcy53Yil0aGlzLndiLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLndiW2JdKSk7dGhpcy50YyYmKGE9dGhpcy5qcyhhLHRoaXMudGMpKTtyZXR1cm4gYX0sbDpmdW5jdGlvbihhLGIsZCxmLGMsZSl7bD10aGlzO3RoaXMuWWc9ITA7dGhpcy5tZD1hO3RoaXMuRGE9Yjt0aGlzLlZlPWQ7dGhpcy5NZD1mO3RoaXMueGM9Yzt0aGlzLmJiPWV8fHt9O3RoaXMuWnIoKTtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuRGEpdGhpcy5YcigpO2Vsc2UgaWYoIm9iamVjdCIhPT10eXBlb2YgdGhpcy5EYSl0cnl7dGhpcy5EYT0KYigpLHRoaXMuWmMoKX1jYXRjaChnKXt0aGlzLmthKCJub0NsaWVudENvbmZpZyIpfX0scGI6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbDt0cnl7Yj1uZXcgRXZlbnQoYSl9Y2F0Y2goZCl7Yj1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxiLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGJ9LFpyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLm1kK3RoaXMuJGQoImdsb2JhbCIpKSx0aGlzLktxLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLiRlKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuWmMoKX0uYmluZCh0aGlzKSwhMCl9LFhyOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgeih0aGlzLkRhK3RoaXMuJGQoImNsaWVudCIsLTEhPXRoaXMuRGEuaW5kZXhPZigiPyIpKSksdGhpcy5aYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy4kZSgiY2xpZW50Iik7dGhpcy5rYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLAohMCl9LCRkOmZ1bmN0aW9uKGEsYil7dmFyIGQ7ZD0oYj8iJiI6Ij8iKSsoImNhY2hlPSIrdGhpcy5HYigpKTt0aGlzLmJiJiZ0aGlzLmJiLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1hJiYoZD0iIik7dGhpcy5iYiYmdGhpcy5iYi5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGthOmZ1bmN0aW9uKGEpe2lmKCF0aGlzLmZlKXt0aGlzLmZlPSEwO3ZhciBiPWZ1bmN0aW9uKCl7Zm9yKHZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGI9MDtiPGEubGVuZ3RoO2IrKyl7aWYoYVtiXSYmYVtiXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGFbYl0ucGF1c2UpdHJ5e2FbYl0ucGF1c2UoKX1jYXRjaChoKXt9YVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pfWE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihiPTA7YjxhLmxlbmd0aDtiKyspYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pOwphPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvLXdyYXBwZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKWFbYl0mJmFbYl0ucGFyZW50Tm9kZSYmYVtiXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGFbYl0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihhPXdpbmRvdy5kb2N1bWVudDthLmhhc0NoaWxkTm9kZXMoKTspYS5yZW1vdmVDaGlsZChhLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQmMoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLnhjPSExKTt0aGlzLnhjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMueGM/dGhpcy54YygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuVWc9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkFmKSk7dGhpcy5MYigpO2UueWMoay5wdCk7KGI9ZS5CYyh0aGlzLm9kKCkpKXx8KGI9ZS5CYyhkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sS3E6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLkRhfHx0aGlzLmNjfHx0aGlzLkhhfHx0aGlzLlpjKCk6KHRoaXMuUmE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLk9iKSksdGhpcy5MYigpKX19LFpjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goZCl7YT10aGlzLkRhfWVsc2UgYT10aGlzLkRhO3RoaXMuaXNFbmFibGVkPXRoaXMuaGMoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuQWE9YS5zZXJ2ZXJ8fFtdO2ZvcihiPTA7Yjx0aGlzLkFhLmxlbmd0aDtiKyspdGhpcy5BYVtiXT10aGlzLkFhW2JdLnJlcGxhY2UoImRhbW9oLndpa2lhLmNvbSIsImRhbW9oLndpa2lhLmNvbS5zdm9ubS1hbGlhcy5jb20iKTt0aGlzLmNjPWEuY29uZmlnfHwiIjt0aGlzLkhhPWEuYWxpYXN8fG51bGw7dGhpcy5LZz1hLmFkcGF0aHx8IiI7dGhpcy5sZT1hLmRpc2FibGVjb29raWV0ZXN0fHwhMTt0aGlzLkRoPU1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSp0aGlzLkFhLmxlbmd0aCk7dGhpcy5pc0VuYWJsZWQmJnRoaXMuY2MmJnRoaXMuSGEmJnRoaXMuQWEubGVuZ3RoP3RoaXMuRWMoITEpOih0aGlzLlJhPXRoaXMuaXNFbmFibGVkPQohMSx0aGlzLlk9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKSx0aGlzLkxiKCkpfSxFYzpmdW5jdGlvbihhKXtpZighdGhpcy5ZKXt2YXIgYj17fTtpZihhKXt2YXIgYj1uZXcgeih0aGlzLnpkKCkpLGQ9dGhpcy52YSh0aGlzLmNjKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iczNob21hZGdsb2JhbGNvbmZpZ3MiO2IuZGF0YS5ob21hZF91cmxfc3VmZml4PWQucGF0aC5zdWJzdHIoMSkucmVwbGFjZSgiaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS8iLCIiKTtiLm1ldGhvZD0iUE9TVCJ9ZWxzZSBiPW5ldyB6KHRoaXMuY2MrdGhpcy4kZCgiY3VzdG9tZXIiKSk7dGhpcy5JYShiLHRoaXMuSnUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuJGUoImN1c3RvbWVyIik7YT90aGlzLlpsP3RoaXMua2EoIm5vU1ZNQ29uZmlnIik6KHRoaXMuWmw9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkVjKCEwKX0uYmluZCh0aGlzKSwKMTAwKSk6dGhpcy5FYyghMCl9LmJpbmQodGhpcyksITApfX0sSnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj17fTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGQpe2lmKCF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZCl7dGhpcy5DYz0hMDt0aGlzLkVjKCEwKTtyZXR1cm59fXRoaXMuS2Q9dGhpcy5oYyhiLnN0cmljdCk7dGhpcy5xZj10aGlzLmhjKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLnBnPWIuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy5qYj10aGlzLmhjKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5oYyhiLmVuYWJsZWQpO3RoaXMuZWM9Yi50ZXN0aGlkZXx8IiI7dGhpcy5nYz1iLnRlc3RhZHRhZ3Nqc3x8Yi50ZXN0YWR0YWdzfHxbXTt0aGlzLklkPWIudGVzdGFkdGFnc3hocnx8W107dGhpcy51Yz1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLndiPWIuYWR0YWdtb2RpZmllcnx8Cm51bGw7dGhpcy50Yz1iLmFkdGFnbW9kaWZpZXJfYWR2fHxudWxsO3RoaXMuY2U9Yi5hZHRhZ3JlZ2V4fHxudWxsO3RoaXMuZGg9Yi5qc3BvcHVwc3x8ITE7dGhpcy5JYj1iLnNpZGVsb2Fkc3x8ITE7dGhpcy5qYz1iLnZwYWlkfHwhMTt0aGlzLmJiLnZwYWlkPXRoaXMuamM7dGhpcy5HaD1iLnNraXBhbGxvd2VkfHwhMTt0aGlzLlhjPWIuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5laT1iLnZtYXBzfHwiIjt0aGlzLldjPWIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1iLmJpdHJhdGV8fDFFMzt0aGlzLktmPWIuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLmRjPWIudGVzdDNyZHBhcnR5Y29va2llJiZiLnRlc3QzcmRwYXJ0eWNvb2tpZSBpbnN0YW5jZW9mIEFycmF5P3RoaXMuQnEoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLmxlJiYodGhpcy5kYz1udWxsKTt0aGlzLm5mPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPQpiLnZpZGVvcGxhemF8fHt9OyF0aGlzLkNjJiZ0aGlzLmlzRW5hYmxlZD8odGhpcy5DYz0hMCx0aGlzLkVjKCEwKSk6dGhpcy5pc0VuYWJsZWQmJiF0aGlzLmJ2KCkmJih0aGlzLmVjfHx0aGlzLmdjfHx0aGlzLmZjfHx0aGlzLmRjfHx0aGlzLklkKT90aGlzLlZlPyh0aGlzLlJhPXRoaXMuWT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucGIodGhpcy5PYikpLHRoaXMuaGUoKSx0aGlzLkxiKCkpOnRoaXMuTnUoKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5PdSgpKX19LE51OmZ1bmN0aW9uKCl7dGhpcy5NdSgpO3RoaXMuUHUoKX0sUHU6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYSsiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciKwphKyInLCBmYWxzZSwgZmFsc2UsIHt9KTt9d2luZG93LnBhcmVudC5kb2N1bWVudC5kaXNwYXRjaEV2ZW50KGV2dCk7In12YXIgYj0iaW5saW5lZXZhbGRhdGEiLGQ9MDt0cnl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7Zi53aWR0aD0xO2YuaGVpZ2h0PTE7Zi5zdHlsZS5kaXNwbGF5PSJub25lIjtmLnNyYz0iYWJvdXQ6YmxhbmsiO3ZhciBjPWUuYWEoMTApLGc9ZS5hYSgxMCksSD1lLmFhKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7Yj1iLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoZyxmdW5jdGlvbigpe2QrKztiPWIucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihILGZ1bmN0aW9uKCl7ZCsrO2I9Yi5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpKwphKEgpK2F0b2IoIlBDOXpZM0pwY0hRK1BITmpjbWx3ZENCMGVYQmxQU0owWlhoMEwycGhkbUZ6WTNKcGNIUWlQbVYyWVd3b0lnPT0iKSthKGcpK2F0b2IoIklpazhMM05qY21sd2RENDhjMk55YVhCMElIUjVjR1U5SW5SbGVIUXZhbUYyWVhOamNtbHdkQ0lnYzNKalBTSmtZWFJoT25SbGVIUXZhbUYyWVhOamNtbHdkRHRpWVhObE5qUXMiKStlLnhiKGEoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYSl7fWlmKDMhPWQpe3ZhciBjPWUuZmQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMuYmImJnRoaXMuYmIucGxheWVyJiZ0aGlzLmJiLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGIsITApOwpyZXR1cm59dGhpcy5rYSgiY3NwXyIrYil9ZS50cmFjaygic3RhdHNfaGRfY3NwIixiLCEwKX19LmJpbmQodGhpcyksMUUzKX0sT3U6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTt0aGlzLkxiKCl9LExjOmZ1bmN0aW9uKGEpe3RoaXMuVmQ9ITA7dGhpcy5ZfHwodGhpcy5ZPXRoaXMuUmE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKGEpKSx0aGlzLkxiKCksdGhpcy5oZSgpKX0sTXU6ZnVuY3Rpb24oKXtpZih0aGlzLmVjKXt2YXIgYT1lLmZkKCk7aWYoKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmdGhpcy5iaCgpKXRoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXthPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuZWMpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5lYyk7CmIuc2V0QXR0cmlidXRlKCJzdHlsZSIsIndpZHRoOjFweDtoZWlnaHQ6MXB4O21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHg7YmFja2dyb3VuZC1jb2xvcjojZmYwMDAwIik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD0wPT09Yi5vZmZzZXRXaWR0aHx8MD09PWIub2Zmc2V0SGVpZ2h0O2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoYik7YT1kfWNhdGNoKGYpe31hP3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIGFkIGVsZW1lbnQgd2FzIGhpZGRlbiIpOnRoaXMuUGgoKX19ZWxzZSB0aGlzLlBoKCl9LE9oOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkdiKCkpO3RoaXMuU3UoZiwwPGQubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLmpmLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5MYyh0aGlzLmxjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKCh0aGlzLmZjPXRoaXMuSWQpJiZ0aGlzLmZjLmxlbmd0aCl7dmFyIGQ9dGhpcy5mYy5zbGljZSgpLGY9IiI7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmpmKCl9LFN1OmZ1bmN0aW9uKGEsYixkKXtmdW5jdGlvbiBmKCl7YygpJiZiKCl9ZnVuY3Rpb24gYygpe3JldHVybiBlPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGUpLCEwKTohMX12YXIgZT13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0aGlzLklhKG5ldyB6KGEpLGYsZnVuY3Rpb24oKXtjKCkmJmQoKX0pfSxQaDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXtmPWQuc2hpZnQoKS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5HYigpKTt0aGlzLlR1KGYsMDxkLmxlbmd0aD9hLmJpbmQodGhpcyk6dGhpcy5PaC5iaW5kKHRoaXMpLGIuYmluZCh0aGlzKSl9ZnVuY3Rpb24gYigpe3RoaXMuTGModGhpcy5sYywibiBIb21hZFV0aWwudGVzdEFkQ2FsbEpTKCkgYWQgY2FsbCB0byAnIisKZisiJyB3YXMgYmxvY2tlZCIpfWlmKHRoaXMuZ2MmJnRoaXMuZ2MubGVuZ3RoKXt2YXIgZD10aGlzLmdjLnNsaWNlKCksZjthLmJpbmQodGhpcykoKX1lbHNlIHRoaXMuT2goKX0sVHU6ZnVuY3Rpb24oYSxiLGQpe2Z1bmN0aW9uIGYoKXtlKCkmJmIoKX1mdW5jdGlvbiBjKCl7ZSgpJiZkKCl9ZnVuY3Rpb24gZSgpe3JldHVybiBnPyh3aW5kb3cuY2xlYXJUaW1lb3V0KGcpLCEwKTohMX12YXIgZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YoKX0sM0UzKTt0cnl7d2luZG93Lm9uZXJyb3I9ZnVuY3Rpb24oYixoKXtoPT1hJiZlKCkmJmMoKX07dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChrKTtrLnNldEF0dHJpYnV0ZSgiYXN5bmMiLCJhc3luYyIpO2suc2V0QXR0cmlidXRlKCJkZWZlciIsImRlZmVyIik7ay5vbmxvYWQ9ZjtrLm9uZXJyb3I9YztrLnNyYz1hO2suYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLApjKX1jYXRjaChsKXtmKCl9fSxqZjpmdW5jdGlvbigpe3RoaXMuZGM/KHRoaXMubWYrKyx0aGlzLklhKG5ldyB6KHRoaXMuZGMpLHRoaXMuTHUuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMua2YoIkNDQyIpfS5iaW5kKHRoaXMpKSk6dGhpcy5NaCgpfSxrZjpmdW5jdGlvbihhKXt0aGlzLkxjKHRoaXMuQmYsIm4gSG9tYWRVdGlsLnRlc3QzcmRQYXJ0eUNvb2tpZSgpIGNhbm5vdCBzZXQgM3JkIHBhcnR5IGNvb2tpZSAiK2EpfSxMdTpmdW5jdGlvbihhKXthPWEucmVzcG9uc2VUZXh0O3ZhciBiPSExO3RyeXtiPUpTT04ucGFyc2UoYSl9Y2F0Y2goZCl7fWImJmIuc3RhdHVzPyJ0cmlnZ2VyLXNldCI9PWIuc3RhdHVzPzM+dGhpcy5tZj90aGlzLmpmKCk6dGhpcy5rZigiQkJCIik6ImFscmVhZHktc2V0Ij09Yi5zdGF0dXMmJnRoaXMuTWgoKTp0aGlzLmtmKCJBQUEiKX0sTWg6ZnVuY3Rpb24oKXt0aGlzLlk9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnBiKHRoaXMuT2IpKTsKdGhpcy5MYigpO3RoaXMuaGUoKX0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9YWRkRXZlbnRMaXN0ZW5lci50b1N0cmluZygpLmluZGV4T2YoIm5hdGl2ZSBjb2RlIikmJi0xPT1hZGRFdmVudExpc3RlbmVyLnRvU3RyaW5nKCkuaW5kZXhPZigiYWRkRXZlbnRMaXN0ZW5lciIpfSxMYjpmdW5jdGlvbigpe3ZhciBhPSIwIixiPSIwIjt0cnl7ZS5TYSgpJiYoYT0iMSIpfWNhdGNoKGQpe2E9Mn10aGlzLlZkJiYoYj0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTsiMSI9PT1iJiYoZS56YSgidC1vbmxpbmUuZGUiKXx8ZS56YSgiZ2lnYS5kZSIpfHxlLnphKCJ3ZWx0LmRlIikpJiZlLnRyYWNrKCJzdGF0c19oZF9hYl9pc1N0ZXZlIix0aGlzLmJoKCksITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5wYih0aGlzLkNmKSk7dGhpcy5NZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLk1kJiZ0aGlzLk1kKCl9LEdvOmZ1bmN0aW9uKCl7aWYodGhpcy5xZiYmCnRoaXMuT3EoKSl7dmFyIGE9dGhpcy5zcSgpO2EmJmEuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sVGg6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9YT1hLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGEsITApfSxJYTpmdW5jdGlvbihhLGIsZCxmLGMsZyl7dGhpcy5uZHx8KHRoaXMubmQ9MCk7dGhpcy5uZCsrO3RoaXMubmQ+dGhpcy5MZyYmIXRoaXMuTWcmJih0aGlzLk1nPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5MZywhMCkpO2E9bmV3IE1hKGEsYixkKTtmJiYoYS5oaT0hMCk7YyYmZS5GcigpJiYoYS54Zz0hMCk7ZyYmKGEuTGg9ITApO3JldHVybiBhLmxvYWQoKX0sRW86ZnVuY3Rpb24oKXtlLlNhKCl8fGUuWmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsCiJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihhKXt2YXIgYj1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmthKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihhPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGFbMF0mJihhPWFbMF0pLGEpe2Y9YSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLnBkKCl8fChhPXRoaXMudmEoZiksZj1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtlLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2UubmV0d29ya1N0YXRlPT0KZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5rYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5rYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMua2EoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmthKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5rYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sS3U6ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuZWl9LEZvOmZ1bmN0aW9uKCl7dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7dmFyIGE9dGhpcy54YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwhMCk7CmEuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2EuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYSx0aGlzLkd2LmJpbmQodGhpcyksdGhpcy5Gdi5iaW5kKHRoaXMpKX0sR3Y6ZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxkPW51bGw7dHJ5eyhiPWEucmVzcG9uc2VYTUwpfHwoYj0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLk9wKCl9LEZ2OmZ1bmN0aW9uKCl7fSxPcDpmdW5jdGlvbigpe2UueWMoay5OcCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5rYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0saGU6ZnVuY3Rpb24oKXtpZih0aGlzLmlzRW5hYmxlZCYmdGhpcy5JYi5sZW5ndGgpZm9yKHZhciBhPTA7YTx0aGlzLkliLmxlbmd0aDthKyspe3ZhciBiPQp0aGlzLkliW2FdOyJyZXF1ZXN0Ij09Yi50eXBlJiZlLlphKGIudXJsLGIuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09Yi50eXBlKXt2YXIgZD1uZXcgSjt3aW5kb3dbZC5pYSgpXT10aGlzO2UuWmEoYi51cmwsYi5hbGlhcyxudWxsLGZ1bmN0aW9uKGEpe2lmKGEucmVzcG9uc2VUZXh0KXRyeXtldmFsKGEucmVzcG9uc2VUZXh0KX1jYXRjaChiKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0sYnY6ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5uZn0sQnE6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmEubGVuZ3RoKV19LEdiOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnJvdW5kKE1hdGgucG93KDEwLGF8fDEwKSooLjg5OTk5OTk5OSpNYXRoLnJhbmRvbSgpKy4xKSl9LGFhOmZ1bmN0aW9uKGEpe2E9YXx8MTA7Zm9yKHZhciBiPSIiLGQ9MDtkPGE7ZCsrKWIrPVN0cmluZy5mcm9tQ2hhckNvZGUoKC41PgpNYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYn0saGM6ZnVuY3Rpb24oYSl7cmV0dXJuIlRydWUiPT1hfHwidHJ1ZSI9PWF8fDE9PWF8fCIxIj09YXx8MT09YX0seGI6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGQsZixjLGUsZyxrLGw9MDtsPGEubGVuZ3RoOylkPWEuY2hhckNvZGVBdChsKyspLGY9YS5jaGFyQ29kZUF0KGwrKyksYz1hLmNoYXJDb2RlQXQobCsrKSxlPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGc9KGYmMTUpPDwyfGM+PjYsaz1jJjYzLGlzTmFOKGYpP2c9az02NDppc05hTihjKSYmKGs9NjQpLGI9YisiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChnKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoayk7cmV0dXJuIGJ9LHZhOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTtmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYltmXV09YVtmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2JbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZywKZnVuY3Rpb24oYSxiLGgpe2ImJihkLnF1ZXJ5S2V5W2JdPWgpfSk7cmV0dXJuIGR9LEZoOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSl7dmFyIGQ9IiIsaCxjO2ZvcihoPTc7MDw9aDtoLS0pYz1hPj4+NCpoJjE1LGQrPWMudG9TdHJpbmcoMTYpO3JldHVybiBkfWZ1bmN0aW9uIGQoYSxiKXtyZXR1cm4gYTw8YnxhPj4+MzItYn12YXIgZixjLGU9QXJyYXkoODApLGc9MTczMjU4NDE5MyxrPTQwMjMyMzM0MTcsbD0yNTYyMzgzMTAyLG09MjcxNzMzODc4LHI9MzI4NTM3NzUyMCxuLHAsdSx0LHY7bj1hLmxlbmd0aDt2YXIgdz1bXTtmb3IoZj0wO2Y8bi0zO2YrPTQpYz1hLmNoYXJDb2RlQXQoZik8PDI0fGEuY2hhckNvZGVBdChmKzEpPDwxNnxhLmNoYXJDb2RlQXQoZisyKTw8OHxhLmNoYXJDb2RlQXQoZiszKSx3LnB1c2goYyk7c3dpdGNoKG4lNCl7Y2FzZSAwOmY9MjE0NzQ4MzY0ODticmVhaztjYXNlIDE6Zj1hLmNoYXJDb2RlQXQobi0xKTw8MjR8ODM4ODYwODticmVhaztjYXNlIDI6Zj0KYS5jaGFyQ29kZUF0KG4tMik8PDI0fGEuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1hLmNoYXJDb2RlQXQobi0zKTw8MjR8YS5jaGFyQ29kZUF0KG4tMik8PDE2fGEuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3Iody5wdXNoKGYpOzE0IT13Lmxlbmd0aCUxNjspdy5wdXNoKDApO3cucHVzaChuPj4+MjkpO3cucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihhPTA7YTx3Lmxlbmd0aDthKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyllW2ZdPXdbYStmXTtmb3IoZj0xNjs3OT49ZjtmKyspZVtmXT1kKGVbZi0zXV5lW2YtOF1eZVtmLTE0XV5lW2YtMTZdLDEpO2M9ZztuPWs7cD1sO3U9bTt0PXI7Zm9yKGY9MDsxOT49ZjtmKyspdj1kKGMsNSkrKG4mcHx+biZ1KSt0K2VbZl0rMTUxODUwMDI0OSY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9MjA7Mzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzE4NTk3NzUzOTMmNDI5NDk2NzI5NSwKdD11LHU9cCxwPWQobiwzMCksbj1jLGM9djtmb3IoZj00MDs1OT49ZjtmKyspdj1kKGMsNSkrKG4mcHxuJnV8cCZ1KSt0K2VbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHQ9dSx1PXAscD1kKG4sMzApLG49YyxjPXY7Zm9yKGY9NjA7Nzk+PWY7ZisrKXY9ZChjLDUpKyhuXnBedSkrdCtlW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSx0PXUsdT1wLHA9ZChuLDMwKSxuPWMsYz12O2c9ZytjJjQyOTQ5NjcyOTU7az1rK24mNDI5NDk2NzI5NTtsPWwrcCY0Mjk0OTY3Mjk1O209bSt1JjQyOTQ5NjcyOTU7cj1yK3QmNDI5NDk2NzI5NX1yZXR1cm4oYihnKStiKGspK2IobCkrYihtKStiKHIpKS50b0xvd2VyQ2FzZSgpfX19KShjKTt2YXIgTmE9Yy5Kanx8TmEsbD1uZXcgTmE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTXE9dGhpcy5hWzhdO3RoaXMucXM9dGhpcy5hWzJdO3RoaXMuaXA9CnRoaXMuYVs3XTt0aGlzLmV0PXRoaXMuYVs4XTt0aGlzLlprPXRoaXMuYVsxMF07dGhpcy5vbz10aGlzLmFbOF07dGhpcy5qPXRoaXMuYVs5XX1jLk5yPWI7Yi5wcm90b3R5cGU9e0xxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5NcTp0aGlzLnBzKGEpfSxwczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucXM6dGhpcy5ocChhKX0saHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmlwOnRoaXMuZHQoYSl9LGR0OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ldDp0aGlzLllrKGEpfSxZazpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWms6dGhpcy5ubyhhKX0sbm86ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLm9vOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgT2E9Yy5Ocnx8T2EsRGM9bmV3IE9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPURjLkxxKDQpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGQpe3RoaXMuYj1hO2EuZi5QP3RoaXMuJGE9YS5mLlAoKTp0aGlzLiRhPSIiO2EuZi5TZyYmYS5mLlNnKHtwYXVzZTp0aGlzLnZkLmJpbmQodGhpcykscmVzdW1lOnRoaXMuQmguYmluZCh0aGlzKSxtdXRlOnRoaXMuS2UuYmluZCh0aGlzKSx1bm11dGU6dGhpcy50di5iaW5kKHRoaXMpfSk7dGhpcy5jb250YWluZXI9dGhpcy5iLmliO3RoaXMucGxheWVyPXRoaXMuYi5mO3RoaXMuVGI9dGhpcy5WYz0hMTt0aGlzLmZvPTFFMzt0aGlzLnBhPW51bGw7dGhpcy5MPWI7dGhpcy5OYj17fTt0aGlzLnZpZGVvPXt9O3RoaXMuRmQ9e307ZS5vYigibmV3QmlnQWRJZCIpO3RoaXMucm89ZS5hYSgxMCk7dGhpcy5mZj0wO3RoaXMuVGM9IldlcmJ1bmcgLSBbdGltZV0iO2QmJmQuYWRtZXNzYWdlJiYodGhpcy5UYz1kLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgZC5hZG1lc3NhZ2UmJgooKGE9dGhpcy5iLmYpJiZ0aGlzLmIuZi5zJiYoYT10aGlzLmIuZi5zKCkpLHRoaXMuVGM9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMubm49ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5uaD10aGlzLkVkPSExO3RoaXMuZ2g9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYz17fTt0aGlzLlpkPSExO3RoaXMuV2g9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5ZYj0hMTt0aGlzLlZvPWUuYWEoMTApO3RoaXMuRmI9ZS5hYSgxMCk7dGhpcy5EYj1lLmFhKDEwKTt0aGlzLkhoPWUuYWEoMTApO3RoaXMuY29uZj17fTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5qZT10aGlzLmNkPXRoaXMuaGY9dGhpcy5yYj10aGlzLmtjPXRoaXMucGg9dGhpcy5oZD10aGlzLmN2PXRoaXMudWI9dGhpcy5FYj0hMTt0aGlzLnBjPVtdOwp0aGlzLiRiPXt9O3RoaXMuaHQ9MjAwO3RoaXMueGY9dGhpcy55Zj10aGlzLmVlPXRoaXMud2Y9dGhpcy5VZT0hMTt0aGlzLnVkPXt9fWMuRGo9YjtiLnByb3RvdHlwZT17aHU6ZnVuY3Rpb24oYSl7dGhpcy5jb25mPWF9LEZhOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuY29uZlthXTt0aGlzLmNvbmZbdGhpcy4kYV0mJnRoaXMuY29uZlt0aGlzLiRhXVthXSYmKGI9dGhpcy5jb25mW3RoaXMuJGFdW2FdKTtyZXR1cm4gYn0sVWg6ZnVuY3Rpb24oKXsicHJlcm9sbCI9PWUuWGImJmUudHJhY2soInN0YXRzX2hkX2FjdGl2ZSIsdGhpcy5XYSgpLCEwKTt0aGlzLkdkKCJjYWxsIix0aGlzLldhKCkpO2UudihrLmVuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LEZlOmZ1bmN0aW9uKGEsYixkLGMpe3RoaXMudWI9ZDt2YXIgZz0hMTtjJiZjLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoZz0hMCk7aWYodGhpcy5MLlkpdGhpcy5mZisrLGUub2IoIm5ld1NtYWxsQWRJZCIpLAp0aGlzLkwuR28oKSxjPWwuZ2V0Q29uZmlnKCksdGhpcy5MLlJhJiZ0aGlzLkwuaXNFbmFibGVkPyh0aGlzLlVoKCksbmV3IFModGhpcyxhLHRoaXMuZ2gse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxrZWVwVVJMOmIsYml0cmF0ZTpjLk9hLGVtcHR5OiJyZXNwb25zZS5lbXB0eSI9PWEsdnBhaWQ6dGhpcy5MLmpjLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmcsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmIuZi5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYi5mLmdldEN1cnJlbnRUaW1lKCl9fSkpOmI/KHRoaXMuVWgoKSxuZXcgUyh0aGlzLGEsdGhpcy5naCx7Zmlyc3RDYWxsOiEwLHZwYWlkOnRoaXMuTC5qYyx1c2VBZFRhZ1BhcmFtZXRlcjohMCxiaXRyYXRlOmMuT2Esa2VlcFVSTDohMCxob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpnLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5iLmYuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmIuZi5nZXRDdXJyZW50VGltZSgpfX0pKToKdGhpcy5QYSgpO2Vsc2V7dmFyIHNjPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe3NjLkZlKGEsYixkKX0sNTApfX0sUWU6ZnVuY3Rpb24oYSl7YS5YYSYmZS50cmFjaygic3RhdHNfaGRfd3JhcHBlcnNjIiwiYWQiLCEwKTt0aGlzLk5kPXRoaXMuTWI9dGhpcy5oZD0hMTt0aGlzLmM9YTt0aGlzLnR1KHRoaXMuYyk7dGhpcy51ZD1uZXcgUGEodGhpcy5jLkl2LHRoaXMudmlkZW8se30pO3RoaXMuSGcoYSk7dGhpcy5wYz10aGlzLnpnKGEpO3RoaXMuUW8oKX0sSGc6ZnVuY3Rpb24oYSl7YSYmKGEub3JpZ2luJiYoYT1hLm9yaWdpbiksYS5wYXJlbnQmJmEucGFyZW50IGluc3RhbmNlb2YgYiYmKHRoaXMuRmQ9dGhpcy5FcShhKSksdGhpcy5IZyhhLnBhcmVudCkpfSx6ZzpmdW5jdGlvbihhKXt2YXIgYz1bXTthJiYoYS5vcmlnaW4mJihhPWEub3JpZ2luKSwhYXx8IWEucGFyZW50fHxhLnBhcmVudCBpbnN0YW5jZW9mIGJ8fChjPXRoaXMuemcoYS5wYXJlbnQpKSxjLnB1c2godGhpcy5ucShhKSkpOwpyZXR1cm4gY30sbnE6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD1bXTtpZihhJiZhLlUmJmEuVS5nZXRBdHRyaWJ1dGUpe2I9YS5VLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylkLnB1c2goYVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpiLGNyZWF0aXZlSUQ6ZH19LEVxOmZ1bmN0aW9uKGEpe3ZhciBiPVtdLGM9W10sZj1bXSxlPVtdLGc9IiI7aWYoYS5VKXtiPWEuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpO2Y9YS5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJDcmVhdGl2ZSIpO2EuVS5nZXRBdHRyaWJ1dGUoImlkIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKTthLlUuZ2V0QXR0cmlidXRlKCJhZElEIikmJihnPWEuVS5nZXRBdHRyaWJ1dGUoImFkSUQiKSxlLnB1c2goZykpO2Zvcih2YXIgaz0KMDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGc9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGcpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoZz1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChnKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS5rYihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZSxhZElkOmd9fSxvYTpmdW5jdGlvbihhKXthLlhhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGI9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuZWQmJmEuZWQuZXJyb3ImJmEuZWQuZXJyb3IuY29kZSYmKGI9YS5lZC5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB3Lk5jLmNvZGU6Yj09Ri5SZC5jb2RlP2UudihrLmR3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSwKdGhpcy5CKCksdGhpcy5DKCkpOihlLkdlKCksYj09Ri5GZi5jb2RlJiZlLnYoay55cyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKTtlLnYoay5NcCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuR2QoImVtcHR5Iix0aGlzLldhKCkpO3RoaXMuVWEoImVtcHR5Iik7YnJlYWs7Y2FzZSB3LkRmLmNvZGU6ZS52KGsuSHYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ2YXN0bG9hZGZhaWxlZCIpO2JyZWFrO2Nhc2Ugdy5HZi5jb2RlOmUudihrLm93LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LlNkLmNvZGU6ZS52KGsuc3csdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy5RZC5jb2RlOmUudihrLnpzLHRoaXMuYy5BLAp0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoIm5vbWVkaWEiKTticmVhaztjYXNlIHcuUGQuY29kZTplLnYoay5Edix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1bW15YWQiKTticmVhaztjYXNlIHcuemYuY29kZTplLnYoay5Fdix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMuVWEoImR1cmF0aW9uIik7YnJlYWs7ZGVmYXVsdDp0aGlzLlVhKCJ1bmtub3duIil9dGhpcy5VYihhKTt0aGlzLlBhKCl9LFViOmZ1bmN0aW9uKGEpe3ZhciBiPTkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihiPWEuZXJyb3IuY29kZSw5MDE8YiYmKGI9OTAwKSk7Zm9yKGI9eyJbRVJST1JDT0RFXSI6Yn07YS5OYS5sZW5ndGg7KXRyeXt2YXIgYz1hLk5hLnBvcCgpO3RoaXMuRWUoYy51cmwsYy50eXBlLGIpfWNhdGNoKGYpe319LHR1OmZ1bmN0aW9uKGEpe3RoaXMuamU9ITE7dGhpcy5OYj10aGlzLmIuSzsKdmFyIGI9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuTmIuekluZGV4PWI7Yj10aGlzLmIuRjt0cnl7dmFyIGM9dGhpcy5iLmYuZ2V0UmF3UGxheWVyKCk7aWYoYyYmYy5lbnZ2YXJzKXRyeXtiPWMuZW52dmFycygpLnZpZGVvU2xvdCx0aGlzLlVlPSEwfWNhdGNoKGYpe319Y2F0Y2goZSl7fWIubXg9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGIuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihiLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBnIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGcpJiZiLnNldEF0dHJpYnV0ZShnLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2ddKTsKdGhpcy5ubiYmdGhpcy5wbGF5ZXIucGUoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLnBlKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2ZvcihjPTA7YzxhLk8ubGVuZ3RoO2MrKyliLmNhblBsYXlUeXBlKGEuT1tjXS50eXBlKSYmdGhpcy5obihiLGEuT1tjXS51cmwrIiIsYS5PW2NdLnR5cGUpO3RoaXMuVWUmJmIubG9hZCgpO2lmKHRoaXMuUWgoYikpe3RoaXMuR2QoInNldHVwIix0aGlzLldhKCkpO3RoaXMubG4oYik7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLlVlP3RoaXMudmlkZW89Yjp0aGlzLnZpZGVvPQp0aGlzLnBhLmFwcGVuZENoaWxkKGIpfWNhdGNoKGspe3RoaXMudmlkZW89Yn19ZWxzZSB0aGlzLmMuUm8oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5wYT10aGlzLk5iLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5wYS5hcHBlbmRDaGlsZChiKSx0aGlzLnJ1KCkpOnRoaXMuYy5vcmlnaW4ucWcody5RZCl9LHJ1OmZ1bmN0aW9uKCl7dGhpcy53Zj0hMDt0aGlzLnJiPXRoaXMua2M9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihlLnYoay5pZyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpLHRoaXMucmI9ITApO2UuaWUoKTt0aGlzLmMmJnRoaXMuYy5vcmlnaW4mJnRoaXMuYy5vcmlnaW4uc2EmJmUubW4odGhpcy5jLm9yaWdpbi5zYSk7CmUuZmIoInNldFVwVnBhaWQiKTt0aGlzLkdkKCJzZXR1cCIsdGhpcy5XYSgpKTt2YXIgYT10aGlzLmIuRjt0aGlzLmIuRj1DLnBvcCgpO2EucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodGhpcy5iLkYsYSk7dGhpcy5iLnFoKCk7dGhpcy5iLmRmKCk7Zm9yKGE9dGhpcy5iLks7YS5maXJzdENoaWxkOylhLnJlbW92ZUNoaWxkKGEuZmlyc3RDaGlsZCk7YS5wYXJlbnR8fHRoaXMuYi5kZigpO3RoaXMucGE9dGhpcy5OYj10aGlzLmIuSzt0aGlzLmFpKCJ2cGFpZCIpO2lmKHRoaXMucmIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5KYigibXV0ZWQiLCJjb250ZW50Iik7ZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX10aGlzLkg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5ILnNldEF0dHJpYnV0ZSgid2lkdGgiLAoiMTAwJSIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuSC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5iLksuYXBwZW5kQ2hpbGQodGhpcy5IKTt0aGlzLkgub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ITE7dGhpcy5iLmYucWEmJnRoaXMuYi5mLnFhKCkmJihhPSEwKTt2YXIgYj10aGlzLmMuSHEoKSxjPXRoaXMuYy5BLk9yaWdpbmFsQWRQYXJhbWV0ZXJzLGc9e2hvbWFkOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobC5nZXRDb25maWcoKSkpLHZwYWlkOnt1cmw6Yi51cmwsdmlld21vZGU6Im5vcm1hbCIsZGVzaXJlZEJpdHJhdGU6Yi5kZXNpcmVkQml0cmF0ZXx8CmIuYml0cmF0ZXx8NDAwLGFkUGFyYW1ldGVyczpjLGNyZWF0aXZlRGF0YTp7QWRQYXJhbWV0ZXJzOmN9LGNvbnRlbnRwbGF5ZXI6e3dpZHRoOnBhcnNlSW50KHRoaXMuYi5LLnN0eWxlLndpZHRoKSxoZWlnaHQ6cGFyc2VJbnQodGhpcy5iLksuc3R5bGUuaGVpZ2h0KX19LGNvbnRlbnRQbGF5ZXI6e211dGVkOmF9fTtlLmxhKHRoaXMuSCwiY29uZmlnIixnKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNTAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDcwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwKImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMUUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UubGEodGhpcy5ILCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDEyMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMTUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmxhKHRoaXMuSCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwyRTMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5sYSh0aGlzLkgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNUUzKX0uYmluZCh0aGlzKTthPWUuJGYoImh0dHBzOi8vczMuYW1hem9uYXdzLmNvbS9ob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tL2lmcmFtZS5odG1sIix0aGlzLkwpO3RoaXMuSC5zcmM9YTtlLmFlKCJ2cGFpZGV2ZW50IixmdW5jdGlvbihhKXsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT0KWyJkYXRhIl0ubmFtZSYmdGhpcy5iLldiKCEwKTtpZihhJiZhLmRhdGEmJmEuZGF0YS5uYW1lKXt0aGlzLnBjPWEuZGF0YS5vcmlnaW5hbGV2ZW50LmFkSURzOyJBZEVycm9yIj09YS5kYXRhLm5hbWUmJnRoaXMuU3YoYSk7aWYoIkFkSW1wcmVzc2lvbiI9PWEuZGF0YS5uYW1lJiYodGhpcy5UdigpLHRoaXMuYi5XYighMCksIXRoaXMuTWIpKXt2YXIgYj0yRTMsYz01MDt0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uJiYodGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi5wZXJjZW50JiYoYz10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQpLHRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TJiYoYj10aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnRpbWVNUykpO3RoaXMuTWI9e2VsOnRoaXMuSCxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLAp0aW1lTVM6YixwZXJjZW50OmMsc3RhcnRUaW1lOiExfTtlLkFlKHRoaXMuTWIpfSJBZFN0YXJ0ZWQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYi5XYighMCksdGhpcy5YdigpKTsiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJih0aGlzLmIuV2IoITApLHRoaXMuYXcoKSk7IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIj09YS5kYXRhLm5hbWUmJnRoaXMuWnYoKTsiQWRWaWRlb01pZHBvaW50Ij09YS5kYXRhLm5hbWUmJnRoaXMuJHYoKTsiQWRWaWRlb1RoaXJkUXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5idygpOyJBZFZpZGVvQ29tcGxldGUiPT1hLmRhdGEubmFtZSYmdGhpcy5ZdigpOyJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5maSgpO2lmKCJBZENsaWNrVGhydSI9PWEuZGF0YS5uYW1lKXt2YXIgZz1hLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2d8fChnPXRoaXMuYy5TYik7aWYoIWcpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLnYoay5oZyx0aGlzLmMuQSwKdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjt0cnl7dGhpcy5MLldjJiYoYT0iX2JsYW5rIik7dmFyIGI9d2luZG93Lm9wZW4oIiIsYSk7Yi5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2IuZG9jdW1lbnQubG9jYXRpb24uaHJlZj1nfWNhdGNoKGMpe3dpbmRvdy5vcGVuKGcsYSl9fS5iaW5kKHRoaXMpLDUwMCl9IkFkU2tpcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLld2KCk7IkFkUmVtYWluaW5nVGltZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiZlLnYoay5ZZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpOyJBZFBhdXNlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLlV2KCk7IkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy55ZiYmKHRoaXMueGY9ITEsdGhpcy5iYygpKSx0aGlzLlZ2KCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKSwKMD09YS5kYXRhLm9yaWdpbmFsZXZlbnQudm9sdW1lPyh0aGlzLnJiPSEwLGImJihiLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5KYigibXV0ZWQiLCJ1c2VyIiksZS52KGsuc2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMucmI9ITEsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uKSx0aGlzLnRyYWNrKCJ1bm11dGUiLCEwKSx0aGlzLkpiKCJ1bm11dGVkIiwidXNlciIpLGUudihrLnBmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLGUudihrLllkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfX0uYmluZCh0aGlzKSk7ZS5hZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLmFlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7CnRoaXMuYi5YZihmdW5jdGlvbihhKXtlLmxhKHRoaXMuSCwicmVzaXplIixhKX0uYmluZCh0aGlzKSl9LFV2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy50cmFjaygicGF1c2UiKTtlLnYoay5XZCx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGxheUJ1dHRvbik7dGhpcy5rYz0hMH0sVnY6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTthJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKTt0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3RoaXMua2M9ITF9LFh2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS52KGsuVGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sCld2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic2tpcCIpO2UudihrLlNmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSl9LFR2OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2UuZmIoImltcHJlc3Npb24iKTt0aGlzLkloKCk7ZS52KGsuT2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYXc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2UuZmIoInN0YXJ0Iik7dGhpcy5WYSgic3RhcnQiKTtlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxadjpmdW5jdGlvbigpe3RoaXMudHJhY2soImZpcnN0UXVhcnRpbGUiKTt0aGlzLmhkPSEwO2UuZmIoImZpcnN0UXVhcnRpbGUiKTt0aGlzLlZhKCJmaXJzdFF1YXJ0aWxlIik7ZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sJHY6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJtaWRwb2ludCIpOwplLmZiKCJtaWRwb2ludCIpO3RoaXMuVmEoIm1pZHBvaW50Iik7ZS52KGsuUWYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKX0sYnc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7ZS5mYigidGhpcmRRdWFydGlsZSIpO3RoaXMuVmEoInRoaXJkUXVhcnRpbGUiKTtlLnYoay5VZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpfSxZdjpmdW5jdGlvbigpe3RoaXMuc2YoKTtlLmZiKCJjb21wbGV0ZSIpO3RoaXMuVmEoImNvbXBsZXRlIil9LGZpOmZ1bmN0aW9uKGEpe2lmKHRoaXMuSCYmdGhpcy5ILnBhcmVudE5vZGUmJnRoaXMuSC5wYXJlbnROb2RlLnBhcmVudE5vZGUpe2UuZmIoImFkc3RvcHBlZCIpO3RoaXMuVWEoInZwYWlkc3RvcHBlZCIpO3ZhciBiPXRoaXMuSC5wYXJlbnROb2RlO3RoaXMuSC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSCk7Yi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpO2UuaWUoKTsKdGhpcy5IPSExO3RoaXMuUGEoYSl9fSxTdjpmdW5jdGlvbihhKXt2YXIgYj1hLm1lc3NhZ2V8fCIiLGM9L1xkKy9nLGY9W107IWImJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGI9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLChmPWIubWF0Y2goYykpP2Yuam9pbiYmKGI9Zi5qb2luKCItIikpOmI9Yi5zdWJzdHJpbmcoMCwyMCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLmZiKCJlcnIiLGIpO2UudihrLmN3LHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5maSghMCl9LGhuOmZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGIuUmEmJmIuaXNFbmFibGVkJiYhYi5wZCgpKXt2YXIgZD1iLnZhKGEpO3JldHVybiBkLnByb3RvY29sKyI6Ly8iK2QuaG9zdH1yZXR1cm4gYX1pZihhLmFwcGVuZENoaWxkKXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKTtmLnNyYz1jKGIsCnRoaXMuTCk7Zi5vbmVycm9yPXRoaXMuTnYuYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsYyhiLHRoaXMuTCkpfSxRaDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRFbGVtZW50c0J5VGFnTmFtZT8wPGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNvdXJjZSIpLmxlbmd0aDohMH0sbG46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMuYmkuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxBZDpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsCnRoaXMuYmkuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy51Zi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLHRoaXMuY2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5zZi5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLnRmLmJpbmQodGhpcykpfSxiaTpmdW5jdGlvbihhKXt0aGlzLlRifHwodGhpcy52aWRlby5jb250cm9scz0hMSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVGJ8fHRoaXMudWYoYSl9LmJpbmQodGhpcyksdGhpcy5mbykpfSx1ZjpmdW5jdGlvbihhKXtpZighdGhpcy5WYyYmdGhpcy5RaCh0aGlzLnZpZGVvKSYmIXRoaXMuRWImJiF0aGlzLlRiKXt0aGlzLlZjPSEwO3RyeXtpZighZS5TYSgpJiZhLnRhcmdldCYmNT49YS50YXJnZXQuZHVyYXRpb24mJjU8TWF0aC5hYnModGhpcy5jLmR1cmF0aW9uLQphLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuRWJ8fCh0aGlzLkViPSEwLHRoaXMuQWQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIix0aGlzLldhKCksITApLHRoaXMuTC5wZ3x8dGhpcy5MLmthKCJ2aWRlby1ub29wIikpO3RoaXMuUGEoKTtyZXR1cm59fWNhdGNoKGIpe2UudHJhY2soInN0YXRzX2hkX25vb3B2aWRlb19mYWlsIix0aGlzLldhKCksITApfXRoaXMuS3YoKTt0aGlzLnZpZGVvLmNvbnRyb2xzPSExO3RoaXMuYi5kZigpO3RoaXMuSnYoKTt0aGlzLmFpKCk7dGhpcy5hZygpO3RoaXMuYi5xaCgpO3RoaXMudmlkZW8ucGxheSYmdGhpcy5nZigpfX0sZ2Y6ZnVuY3Rpb24oKXt0aGlzLmNkfHx0aGlzLk1mKCl9LE1mOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudmlkZW8ucGxheSgpO2lmKGImJmJbImNhdGNoIl0pYlsiY2F0Y2giXShmdW5jdGlvbigpe3RoaXMuY2R8fChhP3RoaXMuUGEoKToodGhpcy5LZSghMCksdGhpcy5NZighMCkpKX0uYmluZCh0aGlzKSk7CmIudGhlbihmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Y2E/KHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLmFjLmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuYWMuYmluZCh0aGlzKSkpOks9ZnVuY3Rpb24oKXt0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0uYmluZCh0aGlzKTt0aGlzLnJlKCkuRWgodGhpcyl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5MLmpiJiYhdGhpcy5FYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiY29tcGxldGUiLCEwKSx0aGlzLlZhKCJjb21wbGV0ZSIpKTt0aGlzLnRyYWNrKCJjb21wbGV0ZSIpO2UudihrLmNuLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSk7dGhpcy5QYSgpfSxQYTpmdW5jdGlvbihhKXtpZighdGhpcy5qZSlpZih0aGlzLmplPQohMCx0aGlzLk5kfHwoZS52KGsuQnMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmMudGJ8fHRoaXMuYy5uYyl7ZS5vYigibmV3U21hbGxBZElkIik7dGhpcy5mZisrO3RoaXMuVGI9dGhpcy5WYz0hMTt0cnl7dGhpcy5BZCh0aGlzLnZpZGVvKX1jYXRjaChiKXt9dHJ5e3RoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goYyl7fXRyeXt0aGlzLk5iLnJlbW92ZUNoaWxkKHRoaXMucGEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuRWQ9ITE7dHJ5e3RoaXMuYi5ZaCgpfWNhdGNoKGcpe310aGlzLmhmPSEwO3RoaXMuYi52ZSgpO3RoaXMuWWI9ITE7dGhpcy5yZSgpLnpoKCk7dGhpcy5jLnRiJiZ0aGlzLmMub3JpZ2luLkxlKCk7dGhpcy5jLm5jJiYoYT90aGlzLmMub3JpZ2luLmtoKCk6dGhpcy5rZSgpKX1lbHNlIHRoaXMua2UoKX0sTnY6ZnVuY3Rpb24oYSl7YS50YXJnZXQucGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChhLnRhcmdldCk7CnRoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuQWQodGhpcy52aWRlbyksdGhpcy50ZihhKSl9LHRmOmZ1bmN0aW9uKGEpe3RoaXMuVGI9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5MLkVvKCk7dGhpcy5jLm9yaWdpbi5xZyh3LlFkKX0sY2k6ZnVuY3Rpb24oKXtpZih0aGlzLmN2KXRoaXMuUGEoKTtlbHNle3RoaXMuWWI9ITA7dGhpcy5iLmYuSmEmJiF0aGlzLmhmJiZ0aGlzLmIuZi5KYSgpJiZlLnYoay5hZCx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7dGhpcy5mdihhKTtpZighdGhpcy5NYil7dmFyIGI9MkUzLGM9NTA7dGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbiYmCih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5NYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuTmQ9ITA7ZS52KGsuZGksdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuQWUodGhpcy5NYil9Yz0iIjt0aGlzLmMuZWYmJihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSGgpKSYmKGM9dGhpcy5jLmVmLWEsMDxjP2M9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYyk6KGM9dGhpcy5jb25mLnNraXBCdXR0b24ucmVwbGFjZSgiW3RpbWVdIixjKSwKdGhpcy5FZHx8KHRoaXMuRWQ9ITAsYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS52KGsuU2YsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTt0aGlzLmMudGI/KHRoaXMuVGI9dGhpcy5WYz0hMSx0aGlzLkFkKHRoaXMudmlkZW8pLHRoaXMucGEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5OYi5yZW1vdmVDaGlsZCh0aGlzLnBhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuRWQ9ITEsdGhpcy5iLlloKCksdGhpcy5jLm9yaWdpbi5MZSgpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYi5pbm5lckhUTUw9Yyk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLlRjLnJlcGxhY2UoIlt0aW1lXSIsZS55Zyh0aGlzLmMuZHVyYXRpb24tYSkpKTt0aGlzLlpkPSEwO3RoaXMudmlkZW8uY29udHJvbHM9ITF9fSxWaDpmdW5jdGlvbigpe3RoaXMucGh8fAoodGhpcy5waD0hMCx0aGlzLmhkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sZnY6ZnVuY3Rpb24oYSl7ZS52KGsuWWQsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKTthPT10aGlzLldofHx0aGlzLkVifHwoMD09YSYmKHRoaXMudWImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMudWIpLHRoaXMudWI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuVmgoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLlZoKCl9LmJpbmQodGhpcykpLHRoaXMuRWJ8fHRoaXMuSWgoKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLHRoaXMuTC5qYiYmdGhpcy5WYSgic3RhcnQiKSxlLnYoay5PZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksCnRoaXMuQigpLHRoaXMuQygpKSxlLnYoay5UZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYy5kdXJhdGlvbi80KSYmKHRoaXMuTC5qYiYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLmhkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS52KGsuTGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSksYT09TWF0aC5mbG9vcih0aGlzLmMuZHVyYXRpb24vMikmJih0aGlzLkwuamImJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSxlLnYoay5RZix0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksdGhpcy5DKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5jLmR1cmF0aW9uLzQpJiYodGhpcy5MLmpiJiYoZS50cmFjaygicXVhcnRpbGUiLAoidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUudihrLlVmLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpLHRoaXMuV2g9YSl9LEdkOmZ1bmN0aW9uKGEsYil7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGIsITApfSxJaDpmdW5jdGlvbigpe2UudHJhY2soInN0YXRzX2hkX2FkX2ltcHJlc3Npb24iLHRoaXMuV2EoKSwhMCl9LFVhOmZ1bmN0aW9uKGEpe2UudHJhY2soInN0YXRzX2hkX2FkX2Vycm9yIixhLCEwKX0sVmE6ZnVuY3Rpb24oYSl7KHRoaXMud2Z8fHRoaXMuTC5qYikmJmUudHJhY2soInN0YXRzX2hkX2FkX3F1YXJ0aWxlXyIrYSx0aGlzLldhKCksITApfSxKYjpmdW5jdGlvbihhLGIpe3RoaXMuTC5qYiYmZS50cmFjaygic3RhdHNfaGRfIithLGIsITApfSx0cmFjazpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLkViKXt0aGlzLnVkJiZ0aGlzLnVkLnRyYWNrJiZ0aGlzLnVkLnRyYWNrKGEpOwppZigibXV0ZSI9PWF8fCJ1bm11dGUiPT1hfHwicGF1c2UiPT1hfHwicmVzdW1lIj09YSl7aWYodGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdKXJldHVybjt0aGlzW2ErIkhhc0JlZW5UcmFja2VkIl09ITB9dmFyIGM9W107dHJ5e2M9dGhpcy5GcSh0aGlzLmMuTmEsYSl9Y2F0Y2goZil7Yz1bXX1mb3IoO2MubGVuZ3RoOyl0cnl7dmFyIGc9Yy5wb3AoKTsiaW1wcmVzc2lvbiI9PWEmJih0aGlzLmVlPSEwKTsiaW1wcmVzc2lvbiI9PWEmJnRoaXMuRmQuaW1wcmVzc2lvbnMmJmUuRHIoZy51cmwsdGhpcy5GZC5pbXByZXNzaW9ucyk/dGhpcy5FZShnLnVybCxnLnR5cGUse30sZnVuY3Rpb24oYSl7dHJ5e3ZhciBiPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIik7ZS52KGsuZG4sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHthZElkOnRoaXMuRmQuYWRJZCxpbXByZXNzaW9uVVJMOmJ9LHRoaXMuQygpKX1jYXRjaChjKXt9fS5iaW5kKHRoaXMpKTp0aGlzLkVlKGcudXJsLApnLnR5cGUpfWNhdGNoKGwpe31pZighYil0cnl7dGhpcy5jLk5hPXRoaXMuY3AodGhpcy5jLk5hLGEpfWNhdGNoKG0pe319fSxXYTpmdW5jdGlvbigpe3ZhciBhPWUuU2EoKT8ibW9iaWxlIjoiZGVmYXVsdCIsYj0iIjt0aGlzLndmJiYoYj0iX3ZwYWlkIik7dGhpcy55ZiYmKGI9Il93ZWxlY3QiKTtyZXR1cm4gYStifSxFZTpmdW5jdGlvbihhLGIsYyxmLGUpe2EmJiJzdHJpbmciPT10eXBlb2YgYSYmYS5sZW5ndGgmJihiPXRoaXMuTC54YShhKSxjJiZiLmduKGMpLGZ8fChmPXRoaXMub2cpLGV8fChlPXRoaXMub2cpLHRoaXMuam4oYSksdGhpcy5MLklhKGIsZnVuY3Rpb24oKXt0aGlzLnloKGEpO2YoKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMueWgoYSk7ZSgpfS5iaW5kKHRoaXMpLCExLCEwKSl9LGpuOmZ1bmN0aW9uKGEpe3RoaXMuJGJbYV09Im9wZW4ifSx5aDpmdW5jdGlvbihhKXt0aGlzLiRiW2FdPSJjbG9zZWQifSxRbzpmdW5jdGlvbigpe3RoaXMuJGI9e319LEZ1OmZ1bmN0aW9uKCl7dmFyIGE9CjAsYjtmb3IoYiBpbiB0aGlzLiRiKXRoaXMuJGIuaGFzT3duUHJvcGVydHkoYikmJiJvcGVuIj09dGhpcy4kYltiXSYmYSsrO3JldHVybiBhfSxGcTpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlPT1ifSl9LGNwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLnR5cGUhPT1ifSl9LEt2OmZ1bmN0aW9uKCl7dGhpcy52aWRlby5zdHlsZSYmKHRoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIix0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5Mdi5iaW5kKHRoaXMpKX0sTHY6ZnVuY3Rpb24oKXtlLlNhKCkmJiJub25lIj09PXRoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT90aGlzLmJjKCk6dGhpcy5jLlNiJiYoZS52KGsuaGcsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnRyYWNrKCJjbGlja3RyYWNraW5nIiksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KIl90b3AiO3RoaXMuTC5XYyYmKGE9Il9ibGFuayIpO3RyeXt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPXRoaXMuYy5TYn1jYXRjaChjKXt3aW5kb3cub3Blbih0aGlzLmMuU2IsYSl9fS5iaW5kKHRoaXMpLDUwMCkpfSxKdjpmdW5jdGlvbigpe2lmKCF0aGlzLmNhcHRpb24pe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl06KGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndpZHRoPSIxMDAlIixhLnN0eWxlLmJhY2tncm91bmQ9ImxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwwLDAsMC4wNSkgMCUscmdiYSgwLDAsMCwwLjI1KSAxMDAlKSIsYS5zdHlsZS5wYWRkaW5nPSIycHgiLGEuc3R5bGUuZm9udEZhbWlseT0iQXJpYWwsIFZlcmRhbmEiLAphLnN0eWxlLmZvbnRTaXplPSI5cHgiLGEuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGEuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGEuc3R5bGUuYm90dG9tPSIwcHgiLGEuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Iik7YS5pbm5lckhUTUw9dGhpcy5UYy5yZXBsYWNlKCJbdGltZV0iLGUueWcoMCkpO3ZhciBiPXRoaXMuY29uZlsiY2FwdGlvbi5kdXJhdGlvbiJdO3RoaXMuTC5YYyYmKGI9dGhpcy5MLlhjKTtiJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLnpiLmJpbmQodGhpcyksMUUzKmIpO3RoaXMuY2FwdGlvbj10aGlzLnBhLmFwcGVuZENoaWxkKGEpfX0semI6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJnRoaXMuY2FwdGlvbiYmdGhpcy5jYXB0aW9uLnN0eWxlJiYodGhpcy5jYXB0aW9uLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX0sQ2Q6ZnVuY3Rpb24oKXsodGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl18fHRoaXMuTC5YYykmJgp0aGlzLmNhcHRpb24mJnRoaXMuY2FwdGlvbi5zdHlsZSYmKHRoaXMuY2FwdGlvbi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxhaTpmdW5jdGlvbihhKXtpZighdGhpcy5jb250cm9scyl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlkPXRoaXMuVm87dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJjb250cm9scy5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYy5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYy5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYy5zdHlsZS5ib3R0b209IjBweCIsYy5zdHlsZS56SW5kZXg9IjEwMDAwIik7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5iYygpO3RoaXMuQ2QoKX0uYmluZCh0aGlzKSk7CmMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9mLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGYuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxmLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsZi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtmLmlkPXRoaXMuRmI7Zi5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uOyJ2cGFpZCI9PWE/KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuU2guYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5TaC5iaW5kKHRoaXMpKSk6KGYuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMuUmguYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsCnRoaXMuUmguYmluZCh0aGlzKSkpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMuYmMoKTt0aGlzLkNkKCl9LmJpbmQodGhpcykpO2YuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5BYigpO3RoaXMuemIoKX0uYmluZCh0aGlzKSk7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Zy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooZy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxnLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsZy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGcuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Zy5pZD10aGlzLkRiO2cuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uOyJ2cGFpZCI9PWE/Zy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5ldi5iaW5kKHRoaXMpKTpnLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5kdi5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKTtnLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuY29uZlsic2tpcC5zdHlsZSJdP2wuc3R5bGU9dGhpcy5jb25mWyJza2lwLnN0eWxlIl06KGwuc2V0QXR0cmlidXRlKCJzdHlsZSIsInBvc2l0aW9uOmFic29sdXRlO3RvcDotNTBweDtyaWdodDowcHgiKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsbC5zdHlsZS50b3A9Ii01MHB4IixsLnN0eWxlLnJpZ2h0PSIwcHgiLGwuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7bC5pZD10aGlzLkhoO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3ZhciBhPWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpOwphJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PTEpfSk7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt2YXIgYT1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJkaXYiKTthJiZhWzBdJiYoYVswXS5zdHlsZS5vcGFjaXR5PS42KX0pO2wuaW5uZXJIVE1MPSIiO2MuYXBwZW5kQ2hpbGQoZik7dGhpcy5jLmVmJiZjLmFwcGVuZENoaWxkKGwpO2MuYXBwZW5kQ2hpbGQoZyk7Yy5zdHlsZS5kaXNwbGF5PSJub25lIjtlLlNhKCl8fCh0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLmJjKCk7dGhpcy5DZCgpfS5iaW5kKHRoaXMpKSx0aGlzLnBhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuQWIoKTt0aGlzLnpiKCl9LmJpbmQodGhpcykpKTt0aGlzLmNvbnRyb2xzPXRoaXMucGEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5jb25mWyJyZXN1bWVDb250cm9sLnN0eWxlIl0/Yi5zdHlsZT10aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXToKKGIuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixiLnN0eWxlLndpZHRoPSIxMDAlIixiLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixiLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixiLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixiLnN0eWxlLmJvdHRvbT0iMHB4IixiLnN0eWxlLnpJbmRleD0iMTAwMDAiLGIuc3R5bGUuZGlzcGxheT0ibm9uZSIsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSxjLm9uZXJyb3I9ZnVuY3Rpb24oKXt0aGlzLndhJiYodGhpcy53YS5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvYmlncGxheTE5MDYwNi5wbmcnKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIpfS5iaW5kKHRoaXMpLGMuc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUhnQUFBQjRDQVlBQUFBNVpEYlNBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UUTFJRGM1TGpFMk16UTVPU3dnTWpBeE9DOHdPQzh4TXkweE5qbzBNRG95TWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVGtnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNk9EZ3dNVVk1TmtZM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2T0Rnd01VWTVOekEzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRG80T0RBeFJqazJSRGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEbzRPREF4UmprMlJUZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VjdvUklBQUF5clNVUkJWSGphN0YwSmJGVFhGYjJEYmNCQUtRR016VzZXUUZwU0tpcldRZ2dwVUlIYmhKSzBxZzFHa0Fnb1FxbEUxUXF6U0VoSTdHRFM0cktKRmd6WTJHckJZSXNDalZBTmhDV2h4UlRDV29QTGpzR0FNYUVHWXd5OTU4MzcxakRNakdmR2YrYi9QLzhkNldqd09Cbi9kOCs4ZTkrOWIzUDA3dDJiOUlURDRmRDVzN2YzZEVBMGYyNGJmdTNLYk11TVkrTG5ONWpObUEwbFh6Q3JtTlhNU21ZNTh5NnpqSG1iV2ZMeTVVdjgvRnp2QitUUHJmTTlULzlOdll4QzFzVmJUSHc3QnpDNzQ5OXNISWphdEo2Zit6OHA5dGZNWXVaWHpOUE1DMVkwa3BVRVJxOGN4aHpCSE16c0dhSy8wMVF5MGUzOWk4d2p6UDNNQTdLM0s0SHJpUVRtKzh5Zk1kOWp4aHI0TEQwbFAyRStZUll5ODVrRnpGS3pHdEJoMGhpY3hKekEvSURaeE9SZndrb3BjaGJ6YjJhTHdRMU1aQ2owenNuTUltbW9aQXVJUy9JWjhheTc1Yk5QTnRqVG1FNWdHR01tUnEvTURjdytGaDc0OVpGdEtKRnRpclc3d0o5S1l5eVY4VFpTa0NEYlZDTGJhRHVCazZRN3k0Z3dZVDBKblNIYm1tU0hVVFFhbk00RGlYRmtML1NSNDRwdHpOK0djOVFkemg0OGlYbU9hVGR4WFRGTzJtQlNKQW44TGVaVzVpWnlsZzN0ampla0xiWksyMWphUlE5bWQ1ek5yNTJWcnE4aGxmbU9mRDFzeFI3OEsvbmdTbHp2Z0cyK2tMYXlsTUNmTWRjcC9mekdPbWt6U3dpOG5UbERhUll3WmtqYm1UWUdSekgzYzh3ZHByUUtHaCtSYzZacU9MUEdURDBZRStuSHlEbWRwMUEvdkN0dDJWQ1hIbHpmMlF1SHc0R2VpM25TdmtvYjNkQlAyblFnNjFOamRBOHVWT0tHQkgybGJRMk53WG44RFh0SGFSRXl3TFo1ekErTjZNRy9aNDVWR29RY1k2V3RneHY1dG1uVEpwaTRpMlVyaTVUdHc0YUJ6SnZzTFl2QzRhSy96My9vejhybVlRY1dFcHhnbmd5bGk4YlEvZS9LMW9aaGI2RHBVNkFDWXo0elh0blpNTVJMRFVJaWNBbzVLeTBLeHVJanFZV3VBbitidVZuWjFqVFlMRFhSVFdCOFlJeXlxMmtRNDIrSDgwZGc3Q2dZbzJ4cU9veVIydFJiNEkxR3RpSXFLb29lUFhwRWp4OC9wZ1lOR2loWkE5UW1LaTR1enRmdnNkSWcxY2dXVkZWVlVkZXVYZW41OCtkVVhGeE1MVnEwRUVMcnZjWERvbWhCemhXYUo0THB3WmdsV21aMEM2NWV2VW9USjA2ay9QeDhHalZxRkYyNmRJbHUzYm9sUkE3UlBtT3JZUW5URVl6QXYyRTJOL3JwYTJwcXFLS2lnaElURXlrdkw0KzJidDFLM2JwMW8zUG56dEhEaHcrRkMxZTkyUHNLR204dUdzSmpvWFpqbzUvK3dZTUhOR0xFQ0JvNGNLRDR1VmV2WHBTYW1rck5taldqa3lkUDB1WExsOFcvR3pac1NDOWV2TENyeURET2N1WkxmM3Z3eC83bVdVWWdOamFXMHRMU3FMQ3drS1pPblVybDVlWENkU011MjNRZ0JxMG1CZUtpMDZ6UXFzNmRPOVBxMWF0cDkrN2ROSHIwYU5HYmJSeWYwL3dWZUNqelRTdTFiTkNnUWJSanh3N2F1SEdqaU05bno1NjFZM3grVTJyM3FzQndhMjc4MU1ON2h0SmZqQjgvbmc0ZE9rUkxsaXdSNHA0NWM0YWVQbjFhbTFiWmdLOXA1OTZETVdxMjlDcU54bzBiMDh5Wk0rbmd3WU0wYmRvMHVudjNycDNpODFqM3pNZTl4VDhuYXgrdFZBdWtWV3ZXcktHOWUvZlM4T0hEUlpIRUJ2RTVXbXJvMVVVbm05WDlCSXNoUTRhSVFkam16WnRyNHpORzNWcHZqa0EzbmVMTlJXTmI0L0JJL1dvalBoODVjb1FXTEZoQTBkSFJRbWd0UGtjWTNwUEZqOWRjOUkvSlhLZnU2QTRVUStiT25Tc0dZdE9uVDZkNzkrNkorSXdDU1FRSkhlWGFVZDBGdGdVUW41RS83OW16SjFMejUxR2VCSDdYYnBVQnhPZGR1M1pSVmxhV21MR0tvUHIyajl3RnhnbXQzY2ltU0U1T3BzT0hEOU9pUllzb0ppYUd6cDgvTDZZcExleTJhL1hVV2pDQWJBN1V0MmZQbmkzeTV5bFRwb2o0WEZKU1l1WDhlWUNyd0Q4Z2hkcjR2RzdkT3BGYWpSdzUwc3J4dVk5ckh2eTJXZk02bzZZQWh3NGRTZ1VGQmFLK3JjVm5MWCsyU0Q3OHRwWUg0MnZaVS9WZHo1Z3dZWUtJejRzWEx4YURMd2lOK0d5QmdSZzBkVURnZHN5T1NrcmY4WG5XckZraVBtUCt1YXlzekFyMWJXamFEaTQ2a1JsdGRwZGpCcURVdVg3OWV0cTNiMTl0ZmZ2bXpadTFzZGxrTm9PbWlWb1BWZ2d3ZjBhUlpNdVdMV0pRZHVIQ0JaRS9tN0EzdDhNVHhTbkpnZ1BXaGgwL2Zwem16NTh2NnRzUTJtVHhPUTRDdDFSU0JZOUdqUnJSdkhuelJIMGI4ODlhZmRzazhia2xZbkFyRlh0MUtCMXhLclYyN1ZyaHVyRUsxQ1R4dVJXK1lzMVZQOVEzZjRiSTJkblpZbEIyOGVKRkkrdmJ6U0Z3SXlXTC9oZzNicHlZZjE2NGNLR29ieU0rUDN2MkxOeENONExBYWx0b2lOQ2tTUk9hTTJlT0tKUk1uanhadklkRkJtRkVEQVIrb2FRSUxaQktiZGl3UVN3MnVILy92dGlPRXk1Z2tWYVZraUMwUUsvRkFvUHQyN2ZYN280TUU2b2g4RE1sUWVpUW01dEx5NWN2cDZLaUlzS1paSzFhdFJKYlljT0VLcFN6bnBqZFNGYmNDNnhOVUdCRTNiUnBVK3JSbzRkb1IzVjFkVGdmNHh2MDRJZXFuK21IYTlldTBkS2xTOFV5M2NyS1NwRWZvOHBsMExSbkJRUXVVN0xVSDBpQlZxeFlJWW9kTjI3Y29BNGRPZ2hpUUdYZ3R0WjdFUGlPa3FkK3dLYjA5UFIwT25YcUZMVnUzVnE0WTRnYXp0R3lGNVFpQnQ5U0VnVWZaMUhJd1BRaGN0N3UzYnVMOTAwZ3JJWmI2TUZYeUhsZmZiU1N6RDljdVhKRkRLQXdYWWdVcUV1WExrYkdXVytBcGxjaDZrMk1EY2k1MUZLaGpqaTdjdVZLV3JWcUZkMitmVnZFV1BSY2crT3NOMXlIdGxyRy9SOGxuMjlnOGdEbmhHQnBMWVJHbk1WVW9ZbmNzVHN1SXNQVUx1VTRTeTdiSFZRZTdEbWZ4ZDVqeEZrOFR4aUxGY0VDbXRiRzNST3FqNzRLbk0rbHhka25UNTZJZXJJSjQ2d3ZuSEFWK0NzbHFSTVlOQ0hPb25hTUJlL3QyN2MzYzV6MWhlT3VBcGV3MjdsTU50NmZCR3pidGsxVW9VNmZQazB0VzdZVTdoaWlXc0FkdTZQRTRYQmNGZ0s3eExlRGRoWDQ2TkdqSXA5Rm5NWEFDU3N4WUJjVEQ2RHF3Z0ZOVjlmYzkzUG1KM1lTOXZyMTZ5TE9idHEwU2JobW5MdGxzVGpyRFo5ci8zRHR3WGdUWDFuVDdjblFleFFObDd0czJUTEt5TWlnMHRKU1NraElFRE0rSmlrdjFoYzFyZ0s3emp5WGt3NVhxWmtkT1RrNTFMZHZYN0c2QXFOanVHT2tQeEEyUW80b0xwUmF2dWFpZ1Z6bWlFZ1UxclZ1akVWd0tDK0tyN3YxZXl4NTBKQzhDZnhYY3Q1R0hURjFhZVN6T0Zrbk16TlR1T1pPblRwRlNwejFHSDJraGw0RmZzVGN5ZnlGMVZ1cXpjK2libnpuenAzYU9HdkJmRFlRN0pJYWtxY1lyT0dQVm04bDZzYjkrdlVUY1Jhalk5YzRHK0hJY0gvRGt5cyt4Q3dtaTUwNEN4dzdka3k0WStTemlMTllMbVB4ZkRZUUZFdnQ2aFFZV01yOGsxVmFoblZRT0NGSHF4dEhlSnoxQm8vM2EzaTc0ajJUbVU0bVB2VWR3RlpOYlg0VytXeDhmRHkxYmRzMlV2TFpRRkRCM09UcEZ3MThKTXNMVEowTDVPWlMvLzc5eGRZUWJmVmloT1d6Z1dDKzFNeHZnWUhQM0Vka1JzSFYxV0pEVjFKU0VxV2twSWdEeTVEUFltTEFaajNXRlZqMjdQV0djRi81TGl3MlUrYkZocUpqeDQ1aU5EeGp4Z3h4ckJFV2orTTlHOFpaVDVoRkhtNWIwZURBZ0tRTy9KZVphTlRUdy8zaVRnWnMyc0tzRDY0QndqVTZOdTZ4cnJoYWx6YitDSXp6aC85aFZBdlFTekdBQWpDSVFvOVYxOXJWQW9lTytwdy84R2ViR3o0ZzM2Z1dvTHlJeGVTZ1RRZFEzcEJQZmt3TytidVBjU0t6V3RuVU5JQVdrL3p5Z0g3MmlBb3A4alpsVzFOZ0V2bTVhVENRbmNnNXpEeGxXOE9SRjBoSEMzU3JlUXFweldwRzRvN1V3UDlCYW9CLzRCbTc5Tkg4V3FSc2JRaVNIQTVIUUNjeVJEVnZIdkF4V2NoWnNDUHhmV1h2c0dJcU9hLzhwVkFMVExJSDQ1NmxnY3J1WWNFZm1JdUMrUi9yYzl3TGJwM2VxV3dmY3V3a0h6ZDhoMUpnNEVQbUYwcURrT0d3dERFWkpUQ0FVdWEvbEJhNkE1dkhodFgzUS9RUUdGWC93Y3gvS2sxMEEyejVRL0l5eHh0dWdVWDZ4QnhFenYxTkN2WERRV2xMWFE2b0MzWVU3UW1jSXIvTTVOZnZNbnNwbllMQ1g1Zy81VnhYdHhtVlVCeWErRXR5cnVkU0NBenAwbmE2SWxTbll2NU9KdVlLL21HcXRKbnVDT1VXbFEzc3NyOG01MTZaemtwRGo4Q0tqR1IyeVYrRzZnK0UrbHhiUFBqM21ObEt5OWVRTFczelpTai9TRGdPTHY2R21jcjhtRnkyTmRvWTVkSVdxZEkyWkhXQk5XVEswWFdPamNYTmtUYklETmNmMUROTjhnZVBPUzd2SUdmbDZ6dk10allSOXQ5TVhOcXdoT1B0WS9kZnVsOWJxK2MxdGtiZDNJUnBMOXhaL0d0eVRqOUdLa3BsRy90UUVGTjlWaFpZQTdhcTRtU2Z0QWdUdWxTMnFSc1p2QjNYZ1FNMTlZTDdBajVQQy9wOExQS0w1ZCtONTlmcDhodHZSWnhrcm1VWG04V3ZIcTlLOE9SK1ErbWl6U1N3Nis5K0lrZVpIekNibUZ6VVNtWUJNMHR6dzc0RVVnSy9pZ1FwOGhoeVRrdkdta1JVOUU1dFEwQ0JlM2hSQXZzdnNDc3c0aDVHemxPQU1EMFo3bXZwY1R6dkVlWis1Z0htN1VCRVZBSlR3QWVldmNYc1RjNTFZVGhMSDFXaE5qcTRkTGpjdTB5VVdTK1JzOUowbW5uQmI2TXFnWFVSMkIzUlV1Q3VzcmZqNHV0NFpndG1NM0pld3FuZDA0aXRIN2p4RFRrcGRnaGd2WEdaN0pVbFV1Q2dUeUExazhEL0YyQUFFOGJCajhkNGRDNEFBQUFBU1VWT1JLNUNZSUk9IiwKYi5zdHlsZS5iYWNrZ3JvdW5kPSJ1cmwoJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0nKSBuby1yZXBlYXQgY2VudGVyIGNlbnRlciIsCmIuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7dGhpcy53YT10aGlzLnBhLmFwcGVuZENoaWxkKGIpO3RoaXMuYi5YZihmdW5jdGlvbihhKXt0aGlzLndhLnN0eWxlLmhlaWdodD1hLmhlaWdodCsicHgifS5iaW5kKHRoaXMpKTsidnBhaWQiIT1hJiZ0aGlzLmIuZi5xYSYmdGhpcy5iLmYucWEoKSYmKGUudihrLmlnLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSksdGhpcy5LZSgpKTt0aGlzLkFiKCl9fSxBYjpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0ibm9uZSJ9LGJjOmZ1bmN0aW9uKCl7dGhpcy53YSYmImJsb2NrIj09dGhpcy53YS5zdHlsZS5kaXNwbGF5fHx0aGlzLnhmfHwodGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxSaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMuYi5GLnBhdXNlZD8odGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbiwKdGhpcy50cmFjaygicmVzdW1lIiwhMCksZS52KGsuUmMsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJub25lIikpOih0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSkpfSxTaDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRmIpO3RoaXMua2M/KGUubGEodGhpcy5ILCJjb250cm9sIiwicGxheSIpLHRoaXMud2EmJih0aGlzLndhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLmtjPSExKTooZS5sYSh0aGlzLkgsImNvbnRyb2wiLAoicGF1c2UiKSx0aGlzLndhJiYodGhpcy53YS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5BYigpLHRoaXMuemIoKSksYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKSx0aGlzLmtjPSEwKX0sdmQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkZiKTt0aGlzLmIuRi5wYXVzZWR8fCh0aGlzLmIuRi5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZS52KGsuV2QsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LEJoOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5GYik7dGhpcy5iLkYucGF1c2VkJiYodGhpcy5iLkYucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLnYoay5SYyx0aGlzLmMuQSx0aGlzLmIuZi5zKCksdGhpcy5CKCksCnRoaXMuQygpKSl9LGR2OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5EYik7dGhpcy5iLkYubXV0ZWQ/KHRoaXMuYi5GLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuSmIoInVubXV0ZWQiLCJ1c2VyIiksZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSk6KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwidXNlciIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSxldjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMucmI/KGUubGEodGhpcy5ILCJjb250cm9sIiwidW5tdXRlIiksdGhpcy5yYj0hMSxhJiYoYS5pbm5lckhUTUw9CnRoaXMuY29uZi5tdXRlQnV0dG9uKSk6KGUubGEodGhpcy5ILCJjb250cm9sIiwibXV0ZSIpLHRoaXMucmI9ITAsYSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pKX0sS2U6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkRiKTt0aGlzLmIuRi5tdXRlZHx8KHRoaXMuYi5GLm11dGVkPSEwLGEuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24sdGhpcy50cmFjaygibXV0ZSIsITApLHRoaXMuSmIoIm11dGVkIiwiY29udGVudCIpLGUudihrLnNkLHRoaXMuYy5BLHRoaXMuYi5mLnMoKSx0aGlzLkIoKSx0aGlzLkMoKSkpfSx0djpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuRGIpO3RoaXMuYi5GLm11dGVkJiYodGhpcy5iLkYubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5KYigidW5tdXRlZCIsImNvbnRlbnQiKSwKZS52KGsucGYsdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSl9LGFjOmZ1bmN0aW9uKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMuYWMpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0Iix0aGlzLmFjKTt0aGlzLmNkfHx0aGlzLlpkfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5nZigpKX0sa2U6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPWwuZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciPT1lLnZhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvciYmKGE9ITAsYi5hZEZhbGxiYWNrVVJMfHwoYi5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3ZhciBjPWUuZmQoKTshdGhpcy5MLmpjfHxlLlNhKCl8fCFjLmlzQ2hyb21lJiYhYy5pc0ZpcmVmb3h8fGMuaXNFZGdlfHwKIShhfHwhdGhpcy5lZSYmYi5hZEZhbGxiYWNrVVJMKXx8dGhpcy5uaD8odGhpcy5jZD0hMCx0aGlzLnViJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnViKSx0aGlzLnViPSExKSx0aGlzLmpnKCkpOih0aGlzLm5oPXRoaXMueWY9dGhpcy54Zj0hMCxlLnRyYWNrKCJzdGF0c193dF9zdGFydCIsdGhpcy5XYSgpLCEwKSx0aGlzLmVlPSEwLGE9ZS4kZihiLmFkRmFsbGJhY2tVUkwsdGhpcy5MLCExLHtvbmx5VVJMOiEwfSksdGhpcy5GZShhLCEwLCExLHtob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczohMH0pKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5GdSgpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuamcoITApfS5iaW5kKHRoaXMpLHRoaXMuaHQpOih0aGlzLmhmPSEwLHRoaXMuYi52ZSgpLHRoaXMuYi5ZdCgpLHRoaXMuWWI9ITEsZS52KGsuVW8sdGhpcy5jLkEsdGhpcy5iLmYucygpLHRoaXMuQigpLHRoaXMuQygpKSx0aGlzLnJlKCkuemgoKSl9LHJlOmZ1bmN0aW9uKCl7dmFyIGE9Cm51bGw7dGhpcy5iJiZ0aGlzLmIuZiYmKGE9dGhpcy5iLmYpO3JldHVybiBhfSxhZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuRmEoIm1pblZpcyIpO2EmJihlLnplKHRoaXMudmlkZW8sYSk/dGhpcy5CaCgpOnRoaXMudmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYWcoKX0uYmluZCh0aGlzKSwxMDApKX0sQjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYy5TYixhLmR1cmF0aW9uPXRoaXMuYy5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYy50Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnBjJiYwPHRoaXMucGMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnBjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LEM6ZnVuY3Rpb24oKXt2YXIgYT0Ke307YS5hZHNlc3Npb25faWQ9dGhpcy5ybysiLSIrdGhpcy5mZjt0aGlzLmMmJnRoaXMuYy5EZyYmKGEuaG9tYWRJbXByZXNzaW9uQWRJZD10aGlzLmMuRGcoKSk7cmV0dXJuIGF9LG9nOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUWE9Yy5Eanx8UWE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMueXY9dGhpcy5hWzddO3RoaXMuU2k9dGhpcy5hWzZdO3RoaXMuY2w9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNV19Yy5WcT1iO2IucHJvdG90eXBlPXt4djpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueXY6dGhpcy5SaShhKX0sUmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLlNpOnRoaXMuYmwoYSl9LGJsOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jbDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIFJhPWMuVnF8fApSYSxFYz1uZXcgUmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1FYy54dig0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm9wdGlvbnM9ZHx8e307aD1jO3RoaXMucGFyZW50PWE7dGhpcy51cmw9Yjt0aGlzLkNhPW51bGw7dGhpcy5YPVtdO3RoaXMuVT1udWxsO3RoaXMub2M9dGhpcy5xYz0hMTt0aGlzLnNhPSIiO3RoaXMudmY9ITE7ZCYmZC5lbXB0eT90aGlzLmJzKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfXZhciBhPTAsaCxkPVtdO2MuRG09YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPWUuZmQoKSxiO2I9ZS52YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTt2YXIgYz0iIjtiLnF1ZXJ5S2V5JiYoYz1iLnF1ZXJ5S2V5Lmh2cCk7CmMmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IHoodGhpcy51cmwpOmwueGEobC5IZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtpZih0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZSl7YT1lLmxnKHRoaXMudXJsKTthfHwoYT10aGlzLnVybCk7aWYoMDw9ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJtYXJ0aGFzdGV3YXJ0IikmJnRoaXMub3B0aW9ucy5BZFN5c3RlbSYmIkdERlAiPT10aGlzLm9wdGlvbnMuQWRTeXN0ZW18fCJhcHBzcG90Ij09Y3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKSkwPGEuaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKXx8ImFwcHNwb3QiPT0KY3x8MDxkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoImZhbmRvbS5jb20iKSYmMDxhLmluZGV4T2YoInB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC8iKT8odGhpcy51cmw9Imh0dHBzOi8vaW1hM3ZwYWlkLmFwcHNwb3QuY29tLz9hZFRhZ1VybD0iK2VuY29kZVVSSUNvbXBvbmVudChsLkhkKGEpKSsiJnR5cGU9anMiLGI9bC54YShsLkhkKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpLGIuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJjb21hcHBzcG90aW1hM3ZwYWlkIik6Yj1sLnhhKGwuSGQoYSksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTtiLmRhdGEuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7dGhpcy5vcHRpb25zLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzJiYoYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1sLklhKGIsdGhpcy5hcy5iaW5kKHRoaXMpLHRoaXMuWXIuYmluZCh0aGlzKSl9LApBZzpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5DYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWUuWGIpdHJ5e3ZhciBmPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2EudGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2NbYl09Zi5maXJzdENoaWxkfWNhdGNoKGQpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7CnZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5DYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuQ2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO3ZhciBjPVtdO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsZil7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1lLlhifHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09ZS5YYnx8dGhpcy5JcihhLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpKXx8bC5LdSgpKXRyeXt2YXIgZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkVGFnVVJJIik7MD49ZC5sZW5ndGgmJihkPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkVGFnVVJJIikpO3ZhciBoPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrCiciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJytkWzBdLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtmW2JdPWguZmlyc3RDaGlsZDtjLnB1c2goaCl9Y2F0Y2goZyl7Zm9yKGE9W10uc2xpY2UuY2FsbChhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKSxiPTA7YjxhLmxlbmd0aDtiKyspYy5wdXNoKGFbYl0pfX0uYmluZCh0aGlzKSk7YT1hLmNvbmNhdChjKTtyZXR1cm4gYT1hLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIik/TnVtYmVyKGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKTxOdW1iZXIoYi5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPy0xOjE6MH0pfSxJcjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLm9wdGlvbnMuY29udGVudFZpZGVvLGM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmCmIuY3VycmVudFRpbWUpKXJldHVybiExOzA8PWEuaW5kZXhPZigiJSIpP2Q9Yi5kdXJhdGlvbi8xMDAqcGFyc2VJbnQoYSk6MDw9YS5pbmRleE9mKCI6IikmJigwPD1hLmluZGV4T2YoIi4iKSYmKGE9YS5zdWJzdHJpbmcoMCxhLmluZGV4T2YoIi4iKSkpLGE9YS5zcGxpdCgiOiIpLGE9YS5yZXZlcnNlKCksZD1wYXJzZUludChhWzBdKSs2MCpwYXJzZUludChhWzFdKSszNjAwKnBhcnNlSW50KGFbMl0pKTtyZXR1cm4gZCYmTWF0aC5hYnMoZC1wYXJzZUludChiLmN1cnJlbnRUaW1lKSk8PWM/ITA6ITF9LGFzOmZ1bmN0aW9uKGEpe3RoaXMuSnQoYSk7dHJ5e3RoaXMuQ2E9YS5yZXNwb25zZVhNTCx0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSl9Y2F0Y2goYil7dGhpcy5vYSh0aGlzLlFhKHcuU2QpKX10aGlzLlg9dGhpcy5BZygpO3RoaXMucWM9dGhpcy5sZigpO3RoaXMub2M9dGhpcy5OaCgpOwp0aGlzLlgubGVuZ3RoP3RoaXMuR2MoKTp0aGlzLm9hKHRoaXMuUWEody5OYyx7ZXJyb3I6dGhpcy52Zj9GLlJkOkYuRWZ9KSl9LGJzOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLkNhfHwodGhpcy5DYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLm9hKHRoaXMuUWEody5TZCkpfXRoaXMuWD10aGlzLkFnKCk7dGhpcy5xYz10aGlzLmxmKCk7dGhpcy5vYz10aGlzLk5oKCk7dGhpcy5YLmxlbmd0aD90aGlzLkdjKCk6dGhpcy5vYSh0aGlzLlFhKHcuTmMse2Vycm9yOnRoaXMudmY/Ri5SZDpGLkVmfSkpfSxZcjpmdW5jdGlvbigpe3RoaXMub2EodGhpcy5RYSh3LkRmLHtkZXB0aDphfSkpfSxHYzpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlguc2hpZnQoKTt0aGlzLktyKCk/dGhpcy5VdSgpPyhhKyssbmV3IGIodGhpcyx0aGlzLklnKCksaCx7QWRTeXN0ZW06dGhpcy5tcSgpLHZwYWlkOnRoaXMub3B0aW9ucy52cGFpZH0pKToKdGhpcy5vYSh0aGlzLlFhKHcuR2YpKTooYT0wLHRoaXMuQnYoKSYmdGhpcy5RZSh0aGlzLldvKCkpKX0sTGU6ZnVuY3Rpb24oKXt0aGlzLnFjPyh0aGlzLnFjPTE8dGhpcy5YLmxlbmd0aCx0aGlzLlgubGVuZ3RoJiZ0aGlzLkdjKCkpOnRoaXMucGFyZW50LkxlKCl9LGtoOmZ1bmN0aW9uKCl7dGhpcy5vYz8odGhpcy5vYz0xPHRoaXMuWC5sZW5ndGgsdGhpcy5YLmxlbmd0aCYmdGhpcy5HYygpKTp0aGlzLnBhcmVudC5raCgpfSxCdjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJ1KCk/dGhpcy5RdSgpPyEwOigtMSE9dGhpcy56YygpP3RoaXMub2EodGhpcy5RYSh3LlBkKSk6dGhpcy5vYSh0aGlzLlFhKHcuemYpKSwhMSk6KHRoaXMub2EodGhpcy5RYSh3Lk5jLEYuRmYpKSwhMSl9LFFlOmZ1bmN0aW9uKGEpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLk5hPWEuTmEuY29uY2F0KHRoaXMuSGUoKSk7YS50Yj1hLnRiP2EudGI6dGhpcy5xYzthLm5jPWEubmM/YS5uYzp0aGlzLm9jO2EuWGE9CmEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5wYXJlbnQuUWUoYSl9LFdvOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IFNhO3RoaXMuc2F8fCh0aGlzLnNhPSIiKTthLmR1cmF0aW9uPXRoaXMuemMoKTthLk89dGhpcy5GZygpO2EuU2I9dGhpcy5vcSgpO2EuSXY9W107YS5vcmlnaW49dGhpczthLkE9dGhpcy5scSgpO2EuZWY9dGhpcy5EcShhLmR1cmF0aW9uKTthLlhhPWEuWGE/YS5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7cmV0dXJuIGF9LG9hOmZ1bmN0aW9uKGIpe3RoaXMuc2F8fCh0aGlzLnNhPSIiKTtiLlhhPWIuWGE/Yi5YYTotMSE9dGhpcy5zYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMud2c7dGhpcy5VJiYoYi5OYT1iLmVycm9yLmNvZGUhPXcuUGQuY29kZT9iLk5hLmNvbmNhdCh0aGlzLnBxKCkpOmIuTmEuY29uY2F0KHRoaXMueXEoKSkpOwp0aGlzLlgubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuVWImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5VYiYmdGhpcy5wYXJlbnQuVWIoYiksYT0wLHRoaXMuR2MoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5vYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50Lm9hJiZ0aGlzLnBhcmVudC5vYShiKSxhPTApfSxVYjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC5VYihhKX0scWc6ZnVuY3Rpb24oYSxiKXt0aGlzLm9hKHRoaXMuUWEoYSxiKSl9LFFhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IFRhKGEsYik7Yy5vcmlnaW49dGhpcztyZXR1cm4gY30sVXU6ZnVuY3Rpb24oKXtyZXR1cm4gYTxofSxSdTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMuRmcoKS5sZW5ndGh9LFF1OmZ1bmN0aW9uKCl7cmV0dXJuIDE8dGhpcy56YygpfSxsZjpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuWC5maWx0ZXIoZnVuY3Rpb24oYSl7dmFyIGI9ITE7YS5nZXRBdHRyaWJ1dGUmJgooYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxOaDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuWCYmMjw9dGhpcy5YLmxlbmd0aCYmIXRoaXMubGYoKSYmKGE9ITApO3JldHVybiBhfSxKdDpmdW5jdGlvbihhKXt0aGlzLnNhPSJVTktOT1dOIjt0cnl7ZC5wdXNoKHRoaXMuc2E9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKSl9Y2F0Y2goYil7dGhpcy5zYT0iVU5LTk9XTiJ9dHJ5e3RoaXMudmY9YS5nZXRSZXNwb25zZUhlYWRlciYmYS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1WcGFpZC1JZ25vcmVkIil9Y2F0Y2goYyl7fX0sS3I6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLklnKCkubGVuZ3RofSxJZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFlKHRoaXMuVSwiVkFTVEFkVGFnVVJJIil9LG1xOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucWUodGhpcy5VLCJBZFN5c3RlbSIpfSxIZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0KIkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtbXS5zbGljZS5jYWxsKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZShkKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhJiYhdGhpcy5WZyhhKSl7dmFyIGM9YS5nZXRBdHRyaWJ1dGUoImV2ZW50Iil8fGQudG9Mb3dlckNhc2UoKTtiLnB1c2goe3R5cGU6Yyx1cmw6dGhpcy5rYihhKX0pfX0uYmluZCh0aGlzKSl9cmV0dXJuIGJ9LFZnOmZ1bmN0aW9uKGEpe3JldHVybiBhPyJDb21wYW5pb24iPT1hLm5vZGVOYW1lPyEwOnRoaXMuVmcoYS5wYXJlbnROb2RlKTohMX0seXE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkhlKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sCnBxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5IZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSxvcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtiKHRoaXMuVS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSxGZzpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaCh7aWQ6YVtjXS5nZXRBdHRyaWJ1dGUoImlkIiksdHlwZTphW2NdLmdldEF0dHJpYnV0ZSgidHlwZSIpLE9hOmFbY10uZ2V0QXR0cmlidXRlKCJiaXRyYXRlIiksd2lkdGg6YVtjXS5nZXRBdHRyaWJ1dGUoIndpZHRoIiksaGVpZ2h0OmFbY10uZ2V0QXR0cmlidXRlKCJoZWlnaHQiKSxPdzphW2NdLmdldEF0dHJpYnV0ZSgiZGVsaXZlcnkiKSx1cmw6dGhpcy5rYihhW2NdKX0pO3ZhciBkPXRoaXMub3B0aW9ucy5PYXx8MUUzO3RyeXt2YXIgaD0KYi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBNYXRoLmFicyhkLWEuT2EpLU1hdGguYWJzKGQtYi5PYSl9KSxiPWguY29uY2F0KGUpfWNhdGNoKGcpe31yZXR1cm4gYn0sbHE6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFkUGFyYW1ldGVycyIpO2EmJjAhPWEubGVuZ3RofHwoYT10aGlzLlUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxkPVtdLGI9ITEsaD0iIixlPVtdLGc9IiIsZz0wO2c8YS5sZW5ndGg7ZysrKXtoPWI9dGhpcy5sZChhW2ddKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9CmJ9ZC5wdXNoKGMpO2UucHVzaChoKX0xPGEubGVuZ3RoPyhiPWQsZz1oKTooYj1jLGc9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmcudG9TdHJpbmcoKX19LHpjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMua2IodGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSxhPWEuc3BsaXQoIjoiKSxhPTM2MDAqK2FbMF0rNjAqK2FbMV0rICthWzJdLGlzTmFOKGEpPy0xOmF9Y2F0Y2goYil7cmV0dXJuLTF9fSxEcTpmdW5jdGlvbihhKXt2YXIgYj0hMSxjPSExLGQ9ITE7dHJ5e2M9dGhpcy5VLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMaW5lYXIiKVswXSxkPWMuZ2V0QXR0cmlidXRlKCJza2lwb2Zmc2V0IiksYj1lLkN1KGQsYSksMD5iJiYoYj0hMSl9Y2F0Y2goaCl7Yj0hMX1yZXR1cm4gYn0scWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpLmxlbmd0aD8KdGhpcy5rYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sdGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGtiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMubGQoYSk6IiJ9LGxkOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMudGUoYSk7YiYmKGI9Yi50cmltKCkpOyFiJiZhLnRleHRDb250ZW50JiYoYj1hLnRleHRDb250ZW50LGI9Yi50cmltKCkpO3JldHVybiBifX19KShjKTt2YXIgUz1jLkRtfHxTO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLm9rPXRoaXMuYVszXTt0aGlzLnhrPXRoaXMuYVsxMF07dGhpcy5Qbz10aGlzLmFbNF07dGhpcy5Cbz10aGlzLmFbOV07dGhpcy5qPXRoaXMuYVs0XX1jLlRwPWI7Yi5wcm90b3R5cGU9e25rOmZ1bmN0aW9uKGEpe3JldHVybiA5PAphP3RoaXMub2s6dGhpcy53ayhhKX0sd2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLnhrOnRoaXMuT28oYSl9LE9vOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Qbzp0aGlzLkFvKGEpfSxBbzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBVYT1jLlRwfHxVYSxGYz1uZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1GYy5uayg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLk5hPVtdO3RoaXMuTz1bXTt0aGlzLlNiPSIiO3RoaXMuQT10aGlzLm5jPXRoaXMudGI9ITE7dGhpcy53ZT10aGlzLm9yaWdpbj1udWxsO3RoaXMueGU9IiJ9Yy5NbD1iO2IucHJvdG90eXBlPXtSbzpmdW5jdGlvbigpe2Zvcih2YXIgYT0KITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSx3cTpmdW5jdGlvbigpe2lmKCF0aGlzLndlJiYKdGhpcy5vcmlnaW4mJnRoaXMub3JpZ2luLkNhKXt2YXIgYT10aGlzLm9yaWdpbi5DYTtpZihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKWZvcih2YXIgYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspKGI9YVtjXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1iLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLndlPWFbY10pfXJldHVybiB0aGlzLndlfSxEZzpmdW5jdGlvbigpe2lmKHRoaXMueGUpcmV0dXJuIHRoaXMueGU7dmFyIGE9IiI7KGE9dGhpcy53cSgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMueGU9YX0sSHE6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYj0wO2I8dGhpcy5PLmxlbmd0aDtiKyspaWYoMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwKMDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk9bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5PW2JdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuT1tiXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk9bYl07cmV0dXJuIGF9fX0pKGMpO3ZhciBTYT1jLk1sfHxTYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuUG49dGhpcy5hWzZdO3RoaXMuSnA9dGhpcy5hWzldO3RoaXMuYXI9dGhpcy5hWzVdO3RoaXMudW89dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbOF19Yy5maj1iO2IucHJvdG90eXBlPXtObjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUG46dGhpcy5JcChhKX0sSXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkpwOnRoaXMuJHEoYSl9LCRxOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5hcjp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMudW86dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBWYT1jLmZqfHxWYSxHYz1uZXcgVmEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1HYy5Obig0KTt2YXIgdz17U2Q6e3R5cGU6ImVycm9yIixjb2RlOjEwMCxtZXNzYWdlOiJYTUwgcGFyc2luZyBlcnJvciIsCk1hOiJYTUxfUEFSU0VfRVJST1IifSx6Zjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTWE6IkRVUkFUSU9OX0VSUk9SIn0sTmM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLE1hOiJFTVBUWV9WQVNUIn0sR2Y6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsTWE6IldSQVBQRVJfTElNSVRfUkVBQ0hFRCJ9LERmOnt0eXBlOiJlcnJvciIsY29kZTozMDEsCm1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixNYToiTE9BRF9FUlJPUiJ9LFFkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixNYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LEZ3Ont0eXBlOiJlcnJvciIsY29kZTo0MDUsbWVzc2FnZToiUHJvYmxlbSBkaXNwbGF5aW5nIE1lZGlhRmlsZS4iLApNYToiTUVESUFGSUxFX0VSUk9SIn0sUGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTWE6IkRVTU1ZX0FEIn19LEY9e0VmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTWE6Ik5PX0FEUyJ9LEZmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixNYToiTk9fTUVESUFGSUxFUyJ9LEd3Ont0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLE1hOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sUmQ6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTWE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMub3M9dGhpcy5hWzddO3RoaXMuaj10aGlzLmFbNF19CmMuVmo9YjtiLnByb3RvdHlwZT17bnM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm9zOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgV2E9Yy5Wanx8V2EsSGM9bmV3IFdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9SGMubnMoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiKXt0aGlzLmVycm9yPWE7dGhpcy5lZD1iO3RoaXMuTmE9W107dGhpcy5vcmlnaW49bnVsbH1jLmtqPWI7Yi5wcm90b3R5cGU9e319KShjKTt2YXIgVGE9Yy5ranx8VGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMua3E9dGhpcy5hWzVdO3RoaXMueGk9dGhpcy5hWzVdO3RoaXMuZmw9dGhpcy5hWzVdO3RoaXMuaj10aGlzLmFbNF19CmMudnA9YjtiLnByb3RvdHlwZT17anE6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmtxOnRoaXMud2koYSl9LHdpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy54aTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmw6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBYYT1jLnZwfHxYYSxJYz1uZXcgWGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1JYy5qcSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuQWg9YTt0aGlzLnZpZGVvPWI7dGhpcy5MZD1bXTt0aGlzLnhoPVtdO3RoaXMuTWU9W107dGhpcy5Ndj0ibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpOwp0aGlzLk0oKX1jLlBrPWI7Yi5wcm90b3R5cGU9e006ZnVuY3Rpb24oKXtmb3IodmFyIGE9MDthPHRoaXMuQWgubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5BaFthXSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkphdmFTY3JpcHRSZXNvdXJjZSIpWzBdLnRleHRDb250ZW50LGY9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiVmVyaWZpY2F0aW9uUGFyYW1ldGVycyIpWzBdLnRleHRDb250ZW50LGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7ZS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBnPWUuY29udGVudFdpbmRvdztnLml4PXtyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLlZ0LmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLk90LmJpbmQodGhpcyl9O3ZhciBrPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7ay5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiOwprLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPWcuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7YS5zcmM9YztnLmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSl9LmJpbmQodGhpcyk7Zy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGspO3RoaXMuTGQucHVzaCh7c3JjOmMsZnJhbWU6ZSxtdDpmLHZlbmRvcjpiLmdldEF0dHJpYnV0ZSgidmVuZG9yIil9KX19LHRyYWNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5NZS5sZW5ndGg7YisrKXt2YXIgYz10aGlzLk1lW2JdO2MudHlwZT09PWEmJmMueW8odGhpcy5xcShhKSl9fSxxcTpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntyeDohMCxxeDo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntleDoidmlkZW8iLHR4OiJqc0N1c3RvbSIsdXg6IjEuMC4wLWRldiJ9fTsKY2FzZSAic3RhcnQiOnJldHVybnt0eXBlOiJzdGFydCIsZGF0YTp7ZHVyYXRpb246MTAsdng6MSxQdzowfX07ZGVmYXVsdDpyZXR1cm57dHlwZTphLGRhdGE6e319fX0sZ2V0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybnthcGlWZXJzaW9uOiIxLjAiLGVudmlyb25tZW50OiJ3ZWIiLGFjY2Vzc01vZGU6ImZ1bGwiLHZpZGVvRWxlbWVudDp0aGlzLnZpZGVvLGFkU2Vzc2lvblR5cGU6Imh0bWwiLGFkU2VydmluZ0lkOiJ1bmRlZmluZWQiLG9taWRKc0luZm86e29taWRJbXBsZW1lbnRlcjoiaG9tYWQiLHNlcnZpY2VWZXJzaW9uOiIxLjAuMC1kZXYifX19LEdxOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0wO2I8dGhpcy5MZC5sZW5ndGg7YisrKWlmKHRoaXMuTGRbYl0udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5MZFtiXS5tdDtyZXR1cm4iIn0sVnQ6ZnVuY3Rpb24oYSxiKXt0aGlzLnhoLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLkdxKGIpLHZlbmRvcjpifSk7CnRoaXMuRHUoKX0sT3Q6ZnVuY3Rpb24oYSxiKXsidmlkZW8iPT09YT90aGlzLk12Lm1hcChmdW5jdGlvbihhKXt0aGlzLllmKGEsYil9LmJpbmQodGhpcykpOnRoaXMuWWYoYSxiKX0sWWY6ZnVuY3Rpb24oYSxiKXt0aGlzLk1lLnB1c2goe3R5cGU6YSx5bzpiLG94OiExfSl9LER1OmZ1bmN0aW9uKCl7dGhpcy54aC5tYXAoZnVuY3Rpb24oYSl7YS5Hcnx8KGEuaHgoe2FkU2Vzc2lvbklkOmUuYWEoMjApLHR5cGU6InNlc3Npb25TdGFydCIsdGltZXN0YW1wOkRhdGUubm93KCksZGF0YTp7dmVyaWZpY2F0aW9uUGFyYW1ldGVyczphLnN4LGNvbnRleHQ6dGhpcy5nZXRDb250ZXh0KCl9fSksYS5Hcj0hMCl9LmJpbmQodGhpcykpfX19KShjKTt2YXIgUGE9Yy5Qa3x8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubXM9dGhpcy5hWzNdO3RoaXMudnY9dGhpcy5hWzEwXTt0aGlzLiRvPQp0aGlzLmFbOV07dGhpcy5xbj10aGlzLmFbMV07dGhpcy5Xbj10aGlzLmFbM107dGhpcy5Ibj10aGlzLmFbMV07dGhpcy5hbD10aGlzLmFbOV07dGhpcy5rcD10aGlzLmFbOF07dGhpcy5qdD10aGlzLmFbNV07dGhpcy5Qaj10aGlzLmFbMl07dGhpcy5qPXRoaXMuYVs2XX1jLktrPWI7Yi5wcm90b3R5cGU9e2xzOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5tczp0aGlzLnV2KGEpfSx1djpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudnY6dGhpcy5abyhhKX0sWm86ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLiRvOnRoaXMucG4oYSl9LHBuOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5xbjp0aGlzLlZuKGEpfSxWbjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuV246dGhpcy5HbihhKX0sR246ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkhuOnRoaXMuJGsoYSl9LCRrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hbDp0aGlzLmpwKGEpfSxqcDpmdW5jdGlvbihhKXtyZXR1cm4gMTwKYT90aGlzLmtwOnRoaXMuaXQoYSl9LGl0OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qdDp0aGlzLk9qKGEpfSxPajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUGo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBZYT1jLktrfHxZYSxKYz1uZXcgWWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1KYy5scyg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIpe3RoaXMuY29uZj1ifHx7fTt0aGlzLmY9YTt0aGlzLmliPWEuQmcoKTt0aGlzLks9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5LLmlkPWUuYWEoMTApO3RoaXMuRj1DLnBvcCgpO3RoaXMuRnx8KGUudHJhY2soInN0YXRzX2hkX25vVmlkZW9UYWdMZWZ0IiwiIiwhMCksdGhpcy5GPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIiksCnRoaXMuRi5pZD0iYWRYZGlzcGxheSIsdGhpcy5GLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5EPXt9O3RoaXMuWmY9ITE7dGhpcy5SYj1bXX1jLlZpPWI7Yi5wcm90b3R5cGU9e2dxOmZ1bmN0aW9uKGEpe3ZhciBiPXt9LGM9ITEsZj0wLGI9MCxlPXt9O2EuZ2V0Qm91bmRpbmdDbGllbnRSZWN0JiYoYj1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGM9ImZpeGVkIixmPWIubGVmdCxiPWIudG9wKTtlPXt4OmYseTpifTtlLnBvc2l0aW9uPWM7cmV0dXJuIGV9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuY29uZi51c2VCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuIHRoaXMuZ3EoYSk7Zm9yKHZhciBiPTAsYz0wLGY9ITEsZT10aGlzLllxKGEpLGc9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2UmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6Cihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZXx8ZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wLGIrPXZvaWQgMCE9PXdpbmRvdy5wYWdlWE9mZnNldD93aW5kb3cucGFnZVhPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0LGMrPWEsdGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCYmKGY9dGhpcy5jb25mLnBvc2l0aW9uSWZGaXhlZCkpO2c9e3g6Yix5OmN9O2YmJihnLnBvc2l0aW9uPWYpO3JldHVybiBnfSxJdTpmdW5jdGlvbigpe3RoaXMuWmY9ITB9LFloOmZ1bmN0aW9uKCl7dGhpcy5GPUMucG9wKCk7dGhpcy5GfHwoZS50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkYuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuRi5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSwKcWg6ZnVuY3Rpb24oKXt0aGlzLmYucGF1c2UoKTtlLnYoay5hZCx0aGlzLmYucygpKX0sWXQ6ZnVuY3Rpb24oKXt0aGlzLlpmfHwodGhpcy5mLnBsYXkoKSxlLnYoay5iZCx0aGlzLmYucygpKSl9LGRmOmZ1bmN0aW9uKCl7dmFyIGE9MjE0NzQ4MzY0Nzt0aGlzLmNvbmYuekluZGV4JiYoYT10aGlzLmNvbmYuekluZGV4KTt0aGlzLmYucGF1c2UoKTt0aGlzLksuc3R5bGUuekluZGV4PWE7dGhpcy5LLnN0eWxlLm1hcmdpbkxlZnQ9ImF1dG8iO3RoaXMuSy5zdHlsZS5tYXJnaW5SaWdodD0iYXV0byI7dGhpcy5LLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIzAwMDAwMCI7dGhpcy5LLnN0eWxlLmJveFNpemluZz10aGlzLmliLnN0eWxlLmJveFNpemluZzt0aGlzLksuc3R5bGUud2lkdGg9dGhpcy5pYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD10aGlzLmliLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5GLnN0eWxlLndpZHRoPXRoaXMuaWIub2Zmc2V0V2lkdGgrCjArInB4Ijt0aGlzLkYuc3R5bGUuaGVpZ2h0PXRoaXMuaWIub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLmdldFBvc2l0aW9uKHRoaXMuaWIpO3RoaXMuZi5JYyYmdGhpcy5mLkljKCk/dGhpcy5mLkJnKCkuYXBwZW5kQ2hpbGQodGhpcy5LKTpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuSyk7d2luZG93LnNldFRpbWVvdXQodGhpcy5XYi5iaW5kKHRoaXMpLDEwKX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0aGlzLmYuZXhpdEZ1bGxzY3JlZW4oKX0sWXE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlLGM9ITE7YTspe2lmKGEuc3R5bGUmJigiZml4ZWQiPT1hLnN0eWxlLnBvc2l0aW9ufHxiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpwOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPQpiLnBvc2l0aW9uOmIucG9zaXRpb249ImFic29sdXRlIjtiLndpZHRoPWEub2Zmc2V0V2lkdGg7Yi5oZWlnaHQ9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGJ9LFdiOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuWnAodGhpcy5pYik7aWYoYi54IT10aGlzLkQueHx8Yi55IT10aGlzLkQueXx8Yi5wb3NpdGlvbiE9dGhpcy5ELnBvc2l0aW9ufHxiLndpZHRoIT10aGlzLkQud2lkdGh8fGIuaGVpZ2h0IT10aGlzLkQuaGVpZ2h0fHxhKXtpZigwPHRoaXMuRC53aWR0aCYmMDx0aGlzLkQuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy52ZSgpO3JldHVybn10aGlzLkQ9Yjt0aGlzLmYuSWMoKT8odGhpcy5LLnN0eWxlLmxlZnQ9IjBweCIsdGhpcy5LLnN0eWxlLnRvcD0iMHB4Iik6KHRoaXMuSy5zdHlsZS5sZWZ0PWIueCsicHgiLHRoaXMuSy5zdHlsZS50b3A9Yi55KyJweCIpO3RoaXMuSy5zdHlsZS53aWR0aD1iLndpZHRoKyJweCI7dGhpcy5LLnN0eWxlLmhlaWdodD1iLmhlaWdodCsKInB4Ijt0aGlzLksuc3R5bGUucG9zaXRpb249Yi5wb3NpdGlvbjt0aGlzLkYuc3R5bGUud2lkdGg9Yi53aWR0aCsicHgiO3RoaXMuRi5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQrInB4Ijtmb3IoYT0wO2E8dGhpcy5SYi5sZW5ndGg7YSsrKXRoaXMuUmJbYV0oe3dpZHRoOmIud2lkdGgsaGVpZ2h0OmIuaGVpZ2h0fSl9ZS5KaCh0aGlzLkspJiZ3aW5kb3cuc2V0VGltZW91dCh0aGlzLldiLmJpbmQodGhpcyksMTApfSxYZjpmdW5jdGlvbihhKXt0aGlzLlJifHwodGhpcy5SYj1bXSk7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJnRoaXMuUmIucHVzaChhKX0sdmU6ZnVuY3Rpb24oKXt0aGlzLksmJnRoaXMuSy5wYXJlbnROb2RlJiZ0aGlzLksucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCYmdGhpcy5LLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5LKTt0aGlzLkYmJnRoaXMuRi5wYXVzZSYmdGhpcy5GLnBhdXNlKCl9fX0pKGMpO2Zvcih2YXIgWmE9Yy5WaXx8WmEsQz1bXSwkYT0wOzEwMD4kYTskYSsrKXt2YXIgTj0KZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtOLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtOLmlkPWUuYWEoMTApO04uY29udHJvbHM9ITA7Qy5wdXNoKE4pfXZhciBLPSExLGNhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsQSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsQSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuaHY9dGhpcy5hWzJdO3RoaXMuU3M9dGhpcy5hWzddO3RoaXMuRWs9dGhpcy5hWzFdO3RoaXMuemk9dGhpcy5hWzJdO3RoaXMudGw9dGhpcy5hWzhdO3RoaXMuWWk9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbN119Yy5Jbj1iO2IucHJvdG90eXBlPXtndjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8CmE/dGhpcy5odjp0aGlzLlJzKGEpfSxSczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU3M6dGhpcy5EayhhKX0sRGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkVrOnRoaXMueWkoYSl9LHlpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy56aTp0aGlzLnNsKGEpfSxzbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudGw6dGhpcy5YaShhKX0sWGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLllpOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgYWI9Yy5Jbnx8YWIsS2M9bmV3IGFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9S2MuZ3YoNCk7KGZ1bmN0aW9uKGMpe2MuQWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsCmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYik7YXx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpKTt0aGlzLlYoYSk7dGhpcy5CZChiKTt0aGlzLm1nKCl9LEJkOmZ1bmN0aW9uKGIpe3RoaXMuaWR8fCh0aGlzLmlkPWIpfSxtZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuR2EoKSxhPXRoaXMudmlkZW9UYWc7YXx8KChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlooYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm1nKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGxheWluZyYmCiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZyYmYi5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSx5ZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGFyYW1ldGVycyYmITE9PT1iLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0scWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnZpZGVvVGFnO3JldHVybiBiP2IubXV0ZWQ6ITB9LHM6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD1jLmlkO2IucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgYmI9Yy5BbHx8YmI7KGZ1bmN0aW9uKGMpe2Muemw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRhKCk7CnRoaXMuUWI9dGhpcy5RYnx8ITE7dGhpcy5QZj10aGlzLlJmPXRoaXMuUmc9dGhpcy5lYT10aGlzLm9mPSExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMuVnAoYSxiKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLm9mPSEwO3RoaXMuUmcmJnRoaXMuZ2coKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5CYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMuWWMoKTsKdGhpcy5SZz0hMDt0aGlzLmdnKCl9LmJpbmQodGhpcykpO3RoaXMuY2coKX0sZ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5RYil7dGhpcy5ZYygpO2lmKCF0aGlzLm9mJiYhdGhpcy5ZYygpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMub2YmJnRoaXMuUGYmJiF0aGlzLlJmJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0sWWM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkdnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGImJmIuYWRNYW5hZ2VycyYmYi5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LEdnOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LApjZzpmdW5jdGlvbigpe2lmKHRoaXMuWWMoKSl7dmFyIGI9dGhpcy5HZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLlJmPTA8Yi5nZXRDdXJyZW50VGltZSgpO3RoaXMuUGY9Yi5Nd310aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5jZygpfS5iaW5kKHRoaXMpLDEwMCl9LFF3OmZ1bmN0aW9uKGIpe3JldHVybiBiLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc0FkUGxheWluZz9iLmN4KCk6ITF9LHpjOmZ1bmN0aW9uKGIpe3JldHVybiBiLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEFkRHVyYXRpb24/Yi56YygpOi0xfSx6cTpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxWcDpmdW5jdGlvbihiLGEpe3RoaXMuUWI9YS5tYXRjaCgvXGQrLyk/CnBhcnNlSW50KGEubWF0Y2goL1xkKy8pWzBdKTowOzEwMDk9PXRoaXMuUWJ8fDMwMj09dGhpcy5RYj90aGlzLmVhPSEwOnRoaXMudSgiYWRlcnJvciIsdGhpcy5RYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLiRjKCl9LmJpbmQodGhpcyksMTAwKX0sJGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO3RoaXMuZWE/KHRoaXMudygpLHRoaXMudGEoKSk6Yi55ZSgpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLnpxKGIpPyh0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuJGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGNiPWMuemx8fGNiOyhmdW5jdGlvbihjKXtjLkJsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sCkhyOmZ1bmN0aW9uKCl7d2luZG93Lk9PLlNsLiRtLlltP3dpbmRvdy5PTy5TbC4kbS5ZbS5LdyhmdW5jdGlvbigpe30pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IcigpfSwxMDApfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBiPWRhKCk7aWYoYiYmYi5fX2ludGVybmFsJiZiLl9faW50ZXJuYWwucGxheWVycyYmMDxlLnNlKGIuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGEgaW4gYi5fX2ludGVybmFsLnBsYXllcnMpaWYoYi5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPW5ldyBiYihiLl9faW50ZXJuYWwucGxheWVyc1thXSk7dGhpcy5OKGMpfHwodGhpcy5SKGMpLChuZXcgY2IoYyx0aGlzLkkpKS5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIGRiPWMuQmx8fGRiLGViPW5ldyBkYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CnRoaXMuVms9dGhpcy5hWzZdO3RoaXMuZXM9dGhpcy5hWzRdO3RoaXMudXA9dGhpcy5hWzNdO3RoaXMudHQ9dGhpcy5hWzEwXTt0aGlzLmo9dGhpcy5hWzhdfWMua209YjtiLnByb3RvdHlwZT17VWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlZrOnRoaXMuZHMoYSl9LGRzOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lczp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMudXA6dGhpcy5zdChhKX0sc3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnR0OnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgZmI9Yy5rbXx8ZmIsTGM9bmV3IGZiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TGMuVWsoNCk7KGZ1bmN0aW9uKGMpe2MuSGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3RoaXMubWE9ITE7dGhpcy5KZygpfSxKZzpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RmlndXJlJiYoYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUoKSk7Ynx8KGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZWxlbWVudCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0VmlkZW9FbGVtZW50JiYoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQoKSk7YiYmIWEmJihhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO2ImJmE/KHRoaXMuVihiKSx0aGlzLlooYSkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5KZygpfS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sCmdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldER1cmF0aW9uKCl9LExhOmZ1bmN0aW9uKCl7dGhpcy50aCgpfSx0aDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKTsxPnRoaXMuZ2V0RHVyYXRpb24oKS1iP3RoaXMuVyYmKDAsdGhpcy5XKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50aCgpfS5iaW5kKHRoaXMpLDEwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQml0bW92aW4ifX0pfSkoYyk7dmFyIGdiPWMuSGl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGRnOmZ1bmN0aW9uKGIpe3ZhciBhPWIuY29kZSxjPWIubWVzc2FnZTtiLmRhdGEmJihhPWIuZGF0YS5jb2RlLGM9Yi5kYXRhLm1lc3NhZ2UpOwoxMjA1IT1hJiYoOTAwPT1hJiYwPGMudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpPyh0aGlzLncoImVtcHR5IiksdGhpcy50YSgpKToxMDA5PT1hfHwzMDM9PWF8fDQwMz09YT90aGlzLnRhKCk6dGhpcy5tKCkpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkRXJyb3JFdmVudHMpZm9yKHZhciBhPTA7YTxiLmFkRXJyb3JFdmVudHMubGVuZ3RoO2ErKyl0aGlzLmRnKGIuYWRFcnJvckV2ZW50cyk7Yi5wbGF5ZXIub24oImFkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuZGcoYSl9LmJpbmQodGhpcykpO2IucGxheWVyLm9uKCJhZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygiYWRxdWFydGlsZSIpfS5iaW5kKHRoaXMpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkucGxheWVyLmlzUGxheWluZygpP3RoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcyksCjEwKX19KX0pKGMpO3ZhciBoYj1jLkdpfHxoYjsoZnVuY3Rpb24oYyl7Yy5JaT1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LHdoOmZ1bmN0aW9uKGIpe2I9bmV3IGdiKGIpO2IubWE/dGhpcy5UKCk6dGhpcy5OKGIpfHwoYi5CZChNYXRoLmNlaWwoMUUxMCpNYXRoLnJhbmRvbSgpKSksdGhpcy5SKGIpLChuZXcgaGIoYix0aGlzLkkpKS5nKCkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5XcHx8KHRoaXMuV3A9ITAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic3ZtOnBsYXllcmluc3RhbmNlIixmdW5jdGlvbihhKXt0aGlzLndoKGEuZGV0YWlsKX0uYmluZCh0aGlzKSkpO2lmKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbiYmd2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuLnZpZGVvUGxheWVySW5zdGFuY2VzLmxlbmd0aDtiKyspdGhpcy53aCh3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXNbYl0pOwp0aGlzLlQoKX19KX0pKGMpO3ZhciBpYj1jLklpfHxpYixUPW5ldyBpYihyKTtULmcoKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ncj10aGlzLmFbNl07dGhpcy5qPXRoaXMuYVs4XX1jLnZ3PWI7Yi5wcm90b3R5cGU9e2ZyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5ncjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBqYj1jLnZ3fHxqYixNYz1uZXcgamIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1NYy5mcig0KTsoZnVuY3Rpb24oYyl7Yy5kbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTsKdGhpcy5WKGIpO2lmKGIpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuWihhKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuTS5iaW5kKHRoaXMpLDEwMCl9LHBhdXNlOmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicGF1c2UiKX1jYXRjaChiKXt9fSxwbGF5OmZ1bmN0aW9uKCl7dHJ5e3RmbXN1aXRlKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS50Zm12aWRlbygicmVzdW1lIil9Y2F0Y2goYil7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwbGF5Iil9fSxJYzpmdW5jdGlvbigpe3ZhciBiPW07cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlRGTXN1aXRlIn19KX0pKGMpO3ZhciBVPWMuZG18fFU7KGZ1bmN0aW9uKGMpe2MuY209CnYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3kuU2MoIiMiK2IsIm9uQWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLncuYmluZCh0aGlzKSwyMDApfS5iaW5kKHRoaXMpKTt5LlNjKCIjIitiLCJvYmplY3QiLGZ1bmN0aW9uKGEpe3RoaXMuTXMoYSl9LmJpbmQodGhpcykpO3kuU2MoIiMiK2IsImFkc0xvYWRlckZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJhZHNMb2FkZXJGYWlsZWQiKTt0aGlzLkcoKX0uYmluZCh0aGlzKSk7eS5TYygiIyIrYiwicmVxdWVzdEFkc0ZhaWxlZCIsZnVuY3Rpb24oKXt0aGlzLnUoImFkZXJyb3IiLCJyZXF1ZXN0QWRzRmFpbGVkIik7dGhpcy5HKCl9LmJpbmQodGhpcykpO3kuTnEoKX0sTXM6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9CmlzTmFOKGJbY10pPyExOmJbY107aWYoMTAwOT09YltjXXx8MTAwMT09YltjXXx8MzAzPT1iW2NdfHw0MDM9PWJbY10pe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59Zm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmKGE9aXNOYU4oYltjXVtkXSk/ITE6YltjXVtkXSwxMDA5PT1iW2NdW2RdfHwxMDAxPT1iW2NdW2RdfHwzMDM9PWJbY11bZF18fDQwMz09YltjXVtkXSkpe3RoaXMudygpO3RoaXMudGEoKTtyZXR1cm59fXRoaXMudSgiYWRlcnJvciIsYSk7dGhpcy5HKCl9fSl9KShjKTt2YXIgVj1jLmNtfHxWOyhmdW5jdGlvbihjKXtjLmVtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy50Zm1zdWl0ZSl7Zm9yKHZhciBiPVtdLGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIiksYz0wO2M8YS5sZW5ndGg7YysrKWIucHVzaChhW2NdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goYVtjXSk7dGhpcy50ZCYmKGI9ZS5mcChiLHRoaXMudGQpKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZD1iW2FdLmlkLnJlcGxhY2UoImNvbnRlbnRFbGVtZW50IiwiIiksZD1uZXcgVShkKTtpZighdGhpcy5OKGQpKXt0aGlzLlIoZCk7dmFyIGY9bmV3IFYoZCx0aGlzLkkpO2YuZygpfX1mb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWZvcihjPWJbYV07Yy5wYXJlbnRFbGVtZW50Oyl7dmFyIGM9Yy5wYXJlbnRFbGVtZW50LGc9Yy5nZXRBdHRyaWJ1dGUoImlkIik7aWYoZyl0cnl7dGZtc3VpdGUoIiMiK2cpLnRmbXZpZGVvKCJyZXN1bWUiKSx0aGlzLnRkfHwodGhpcy50ZD1bXSksdGhpcy50ZC5wdXNoKGJbYV0pLGQ9bmV3IFUoZyksdGhpcy5OKGQpfHwodGhpcy5SKGQpLGY9bmV3IFYoZCx0aGlzLkkpLGYuZygpKX1jYXRjaChrKXt9fX10aGlzLlQoKX0sU2M6ZnVuY3Rpb24oYixhLGMpe3RoaXMuZGF8fCh0aGlzLmRhPXt9KTt0aGlzLmRhW2JdfHwKKHRoaXMuZGFbYl09e30pO3RoaXMuZGFbYl1bYV18fCh0aGlzLmRhW2JdW2FdPVtdKTt0aGlzLmRhW2JdW2FdLnB1c2goYyl9LFZ1OmZ1bmN0aW9uKGIpe3ZhciBhPWIuc1BsYXllclNlbGVjdG9yO2lmKGIpaWYoIXRoaXMuZGF8fHRoaXMuZGEmJiF0aGlzLmRhW2FdKXRoaXMuRmN8fCh0aGlzLkZjPVtdKSx0aGlzLkZjLnB1c2goYiksdGhpcy5YdCgpJiYodGhpcy5YZSgpLHRoaXMuZygpKTtlbHNle3ZhciBjPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGIub0V2ZW50VHlwZSYmKGM9Yi5vRXZlbnRUeXBlKTtpZih0aGlzLmRhW2FdW2NdJiYwPHRoaXMuZGFbYV1bY10ubGVuZ3RoKWZvcih2YXIgZD0wO2Q8dGhpcy5kYVthXVtjXS5sZW5ndGg7ZCsrKXRoaXMuZGFbYV1bY11bZF0oYil9fSxOcTpmdW5jdGlvbigpe2lmKHRoaXMuRmMpZm9yKHZhciBiPTA7Yjx0aGlzLkZjLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuRmNbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09CnR5cGVvZiBhLm9FdmVudFR5cGUmJihkPWEub0V2ZW50VHlwZSk7aWYodGhpcy5kYVtjXVtkXSYmMDx0aGlzLmRhW2NdW2RdLmxlbmd0aClmb3IodmFyIGY9MDtmPHRoaXMuZGFbY11bZF0ubGVuZ3RoO2YrKyl0aGlzLmRhW2NdW2RdW2ZdKGEpfX0sdmlkZW9wa2dJbnRlcmZhY2U6ZnVuY3Rpb24oYil7ImF1dG9SZXNpemVDYWxsYmFja0JlZm9yZSIhPWIub0V2ZW50VHlwZS5oJiYiYXV0b1Jlc2l6ZUNhbGxiYWNrQWZ0ZXIiIT1iLm9FdmVudFR5cGUuaCYmeS5WdShiKX19KX0pKGMpO3ZhciBrYj1jLmVtfHxrYix5PW5ldyBrYihyKTtiYSgpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmlxPXRoaXMuYVsxMF07dGhpcy5Ncj10aGlzLmFbNF07dGhpcy5ibT10aGlzLmFbMl07dGhpcy55cD10aGlzLmFbOF07dGhpcy5Zcz10aGlzLmFbM107dGhpcy5Cbj10aGlzLmFbMTBdO3RoaXMuJG49CnRoaXMuYVsxXTt0aGlzLmo9dGhpcy5hWzJdfWMudm89YjtiLnByb3RvdHlwZT17aHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlxOnRoaXMuTHIoYSl9LExyOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Ncjp0aGlzLmFtKGEpfSxhbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuYm06dGhpcy54cChhKX0seHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnlwOnRoaXMuWHMoYSl9LFhzOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Zczp0aGlzLkFuKGEpfSxBbjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQm46dGhpcy5abihhKX0sWm46ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy4kbjp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBsYj1jLnZvfHxsYixOYz1uZXcgbGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9TmMuaHEoNCk7KGZ1bmN0aW9uKGMpe2MuRGk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5tdXRlZD0hMTt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlYoYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5aKGEpfSxwYXVzZTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBhdXNlKCl9KX0scGxheTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLnBsYXkoKX0pfSxKYTpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiYKYi5wYXVzZSgpfSl9LHFhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBtYj1jLkRpfHxtYjsoZnVuY3Rpb24oYyl7Yy5FaT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXIubXV0ZWQ9YS5kYXRhLm11dGVkO2Eub24oImVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe2lmKCFhLmlzUGxheWluZ3x8YS5pc1BsYXlpbmcoKSlhLmlzQWQmJmEuaXNBZCgpP3RoaXMudygpOmEuZGF0YSYmYS5kYXRhLmFkcyYmYS5kYXRhLmFkcy52YXN0JiZhLmRhdGEuYWRzLnZhc3Quc3JjZXM/Cih0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnUoIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkcoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5HKCl9LmJpbmQodGhpcykpO2Eub24oIkFkTG9hZGVkIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiQWRTdGFydGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvU3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkUGxheWluZyIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiLApmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbmI9Yy5FaXx8bmI7KGZ1bmN0aW9uKGMpe2MuRmk9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibWVkaWFwbGF5ZXIiKTtpZih3aW5kb3cuZGUmJndpbmRvdy5kZS5iaWxkJiZ3aW5kb3cuZGUuYmlsZC5tZWRpYXBsYXllciYmYiYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYilpZihiLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1iW2FdLGQ9IiI7dHJ5e2Q9Yy5nZXRBdHRyaWJ1dGUoImlkIil9Y2F0Y2goZil7ZD1jLmlkfWlmKGQmJiQoIiMiK2QpLmRhdGEoIm1lZGlhcGxheWVyIikpdHJ5e3ZhciBlPQpuZXcgbWIoZCk7dGhpcy5OKGUpfHwodGhpcy5SKGUpLChuZXcgbmIoZSx0aGlzLkkpKS5nKCkpfWNhdGNoKGcpe319dGhpcy5UKCl9LE46ZnVuY3Rpb24oYil7dmFyIGE9Yi5nZXRSYXdQbGF5ZXIoKTskKCIjIithKTtmb3IodmFyIGMgaW4gdGhpcy5LYSlpZihhPT10aGlzLkthW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwO3JldHVybiB0aGlzLkthW2IuamEoKV0/ITA6ITF9fSl9KShjKTt2YXIgb2I9Yy5GaXx8b2IscGI9bmV3IG9iKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlJsPXRoaXMuYVszXTt0aGlzLm1yPXRoaXMuYVsyXTt0aGlzLnhqPXRoaXMuYVsxXTt0aGlzLlVxPXRoaXMuYVs5XTt0aGlzLkpzPXRoaXMuYVs5XTt0aGlzLm9yPXRoaXMuYVs3XTt0aGlzLkZzPXRoaXMuYVsxMF07dGhpcy5qPXRoaXMuYVs3XX1jLnd2PWI7Yi5wcm90b3R5cGU9e1FsOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuUmw6dGhpcy5scihhKX0sbHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm1yOnRoaXMud2ooYSl9LHdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy54ajp0aGlzLlRxKGEpfSxUcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuVXE6dGhpcy5JcyhhKX0sSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkpzOnRoaXMubnIoYSl9LG5yOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5vcjp0aGlzLkVzKGEpfSxFczpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkZzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuajphfX19KShjKTt2YXIgcWI9Yy53dnx8cWIsT2M9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9T2MuUWwoNCk7KGZ1bmN0aW9uKGMpe2Mub2w9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSwKTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzJiZ0aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTt0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpLmNvbnRhaW5lcklEKSk7YiYmKGE9Yik7dGhpcy5WKGIpO3RoaXMuWihhKTt0aGlzLk50KHRoaXMuZ2V0UmF3UGxheWVyKCksYik7dGhpcy5nZXRSYXdQbGF5ZXIoKX0scGF1c2U6ZnVuY3Rpb24oKXt9LHBsYXk6ZnVuY3Rpb24oKXt9LE50OmZ1bmN0aW9uKGIsYSl7YiYmYi5wYXVzZUV2ZW50JiZhLmFkZEV2ZW50TGlzdGVuZXIoYi5wYXVzZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEucGF1c2UmJnRoaXMuaGEucGF1c2UoKX0uYmluZCh0aGlzKSk7YiYmYi5yZXN1bWVFdmVudCYmYS5hZGRFdmVudExpc3RlbmVyKGIucmVzdW1lRXZlbnQsCmZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS5yZXN1bWUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnJlc3VtZSYmdGhpcy5oYS5yZXN1bWUoKX0uYmluZCh0aGlzKSk7YiYmYi5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLm11dGVFdmVudCxmdW5jdGlvbigpe3RoaXMuaGEmJnRoaXMuaGEubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuaGEubXV0ZSYmdGhpcy5oYS5tdXRlKCl9LmJpbmQodGhpcykpO2ImJmIudW5tdXRlRXZlbnQmJmEuYWRkRXZlbnRMaXN0ZW5lcihiLnVubXV0ZUV2ZW50LGZ1bmN0aW9uKCl7dGhpcy5oYSYmdGhpcy5oYS51bm11dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmhhLnVubXV0ZSYmdGhpcy5oYS51bm11dGUoKX0uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKGIpe3RoaXMuaGE9Yn0sUDpmdW5jdGlvbigpe3JldHVybiJPbmx5SE9NQUQifX0pfSkoYyk7dmFyIHJiPWMub2x8fHJiOyhmdW5jdGlvbihjKXtjLm5sPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsCmEpe3RoaXMubyhiLGEpO3RoaXMuZ2k9ITF9LGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGE9dGhpcy5nZXRQbGF5ZXIoKTtiLmF1dG9zdGFydCYmIXRoaXMuZ2kmJih0aGlzLkcoKSx0aGlzLmdpPSEwLHRoaXMucmEoKSk7YS5HYSgpLmFkZEV2ZW50TGlzdGVuZXIoYi5wbGF5RXZlbnQsZnVuY3Rpb24oKXt0aGlzLkcoKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgc2I9Yy5ubHx8c2I7KGZ1bmN0aW9uKGMpe2MucGw9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYobSl7aWYobS5wbGF5ZXIpe3ZhciBiPW0ucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXRyeXtiPWIoKX1jYXRjaChhKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGIubGVuZ3RoO2QrKyljPW5ldyByYihiW2RdKSx0aGlzLk4oYyl8fCh0aGlzLlIoYyksKG5ldyBzYihjLAp0aGlzLkkpKS5nKCkpfX1lbHNlIHRoaXMuVCgpfX0pfSkoYyk7dmFyIHRiPWMucGx8fHRiLFc9bmV3IHRiKHIpO1cuZygpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmh3PXRoaXMuYVsyXTt0aGlzLlB2PXRoaXMuYVs0XTt0aGlzLnhyPXRoaXMuYVs0XTt0aGlzLm1qPXRoaXMuYVs5XTt0aGlzLlByPXRoaXMuYVsxXTt0aGlzLmZ1PXRoaXMuYVs2XTt0aGlzLlJrPXRoaXMuYVs3XTt0aGlzLlNwPXRoaXMuYVszXTt0aGlzLmo9dGhpcy5hWzVdfWMuWnU9YjtiLnByb3RvdHlwZT17Z3c6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmh3OnRoaXMuT3YoYSl9LE92OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Qdjp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueHI6dGhpcy5saihhKX0sbGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLm1qOgp0aGlzLk9yKGEpfSxPcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUHI6dGhpcy5ldShhKX0sZXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmZ1OnRoaXMuUWsoYSl9LFFrOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5Sazp0aGlzLlJwKGEpfSxScDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuU3A6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciB1Yj1jLlp1fHx1YixQYz1uZXcgdWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD1QYy5ndyg0KTsoZnVuY3Rpb24oYyl7Yy5KbT10LmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LE06ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5aKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy52aWRlb1RhZztyZXR1cm4gYj9iLm11dGVkOiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxMYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuVz8oMCx0aGlzLlcpKCk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5MYSgpfS5iaW5kKHRoaXMpLDQwMCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iV0Z2NCJ9fSl9KShjKTt2YXIgdmI9Yy5KbXx8dmI7KGZ1bmN0aW9uKGMpe2MuSW09di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sVmI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLGI9Yi5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5pbWFBZHNMb2FkZXJ9LEx0OmZ1bmN0aW9uKGIpe2IuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7dGhpcy5hYnx8KHRoaXMuYWI9W10pO3RoaXMuYWIucHVzaChhLmdldEVycm9yQ29kZSgpKTsxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLnRhKCk6dGhpcy51KCJhZGVycm9yIiwKYS5nZXRFcnJvckNvZGUoKSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzTWFuYWdlckxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLnJjPSEwO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImxvZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnlhP3RoaXMuTHQodGhpcy55YSk6KHRoaXMueWE9dGhpcy5WYigpLHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwMCkpfSxtOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTtpZihiLmlzUGxheWluZyYmMTxiLmdldEN1cnJlbnRUaW1lKCkpe2lmKCF0aGlzLnlhKXt0aGlzLkcoKTtyZXR1cm59aWYoIXRoaXMucmMpe3RoaXMuRygpO3JldHVybn1iPSEwO2lmKHRoaXMuYWImJnRoaXMuYWIubGVuZ3RoJiYxPHRoaXMuYWIubGVuZ3RoKWZvcih2YXIgYT0wO2E8dGhpcy5hYi5sZW5ndGgtCjE7YSsrKTEwMDkhPXRoaXMuYWJbYV0mJjMwMyE9dGhpcy5hYlthXSYmNDAzIT10aGlzLmFiW2FdJiYoYj0hMSk7aWYoYil0aGlzLncoImVtcHR5IiksdGhpcy50YSgpO2Vsc2V7dGhpcy5HKCk7cmV0dXJufX13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpLDUwMCl9fSl9KShjKTt2YXIgd2I9Yy5JbXx8d2I7KGZ1bmN0aW9uKGMpe2MuS209cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7dGhpcy5UYT0tMTt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZih3aW5kb3cud2Z2NF9odG1sNV9wbGF5ZXImJjA8Yi5sZW5ndGgpZm9yKHZhciBhIGluIGIpe3ZhciBjPW5ldyB2YihiLml0ZW0oYSkpO3RoaXMuTihjKXx8LTE9PWMuaWQuc2VhcmNoKCJ2aWRlb18iKXx8KHRoaXMuUihjKSwobmV3IHdiKGMsdGhpcy5JKSkuZygpKX10aGlzLlQoKX19KX0pKGMpO3ZhciB4Yj1jLkttfHwKeGIseWI9bmV3IHhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlFwPXRoaXMuYVs1XTt0aGlzLnZuPXRoaXMuYVs3XTt0aGlzLmF0PXRoaXMuYVs0XTt0aGlzLnV3PXRoaXMuYVsxXTt0aGlzLlJuPXRoaXMuYVs1XTt0aGlzLkl0PXRoaXMuYVs0XTt0aGlzLmo9dGhpcy5hWzZdfWMuQ209YjtiLnByb3RvdHlwZT17UHA6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlFwOnRoaXMudW4oYSl9LHVuOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy52bjp0aGlzLiRzKGEpfSwkczpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuYXQ6dGhpcy50dyhhKX0sdHc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy51dzp0aGlzLlFuKGEpfSxRbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm46dGhpcy5IdChhKX0sSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkl0Ogp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmo6YX19fSkoYyk7dmFyIHpiPWMuQ218fHpiLFFjPW5ldyB6YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVFjLlBwKDQpOyhmdW5jdGlvbihjKXtjLlhsPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIilbMF07dGhpcy5WKGIpO3RoaXMuWihiLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLlJlPSExfSxMYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy54dCgpfS5iaW5kKHRoaXMpLDUwMCl9LHh0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQb3NpdGlvbigpLAphPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLlcmJnRoaXMuVygpfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0RHVyYXRpb24mJihhPWIucGxheWJhY2suZ2V0RHVyYXRpb24oKSk7cmV0dXJuIGF9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5wbGF5YmFjay5nZXRQb3NpdGlvbiYmKGE9Yi5wbGF5YmFjay5nZXRQb3NpdGlvbigpKTtyZXR1cm4gYX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLlJlJiZ3aW5kb3cuY2xlYXJJbnRlcnZhbCh0aGlzLlJlKTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXliYWNrLnBsYXkoKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi5wbGF5YmFjayYmCmIucGxheWJhY2suZ2V0UGxheVN0YXRlPyhiLnBsYXliYWNrLmdldFBsYXlTdGF0ZSgpLCJwbGF5aW5nIj09Yi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSk6ITF9LEV1OmZ1bmN0aW9uKCl7dGhpcy5SZT13aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCl9LmJpbmQodGhpcyksMTApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJvY2tlcnkifX0pfSkoYyk7dmFyIEFiPWMuWGx8fEFiOyhmdW5jdGlvbihjKXtjLldsPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSk7dGhpcy5pYz0wfSxnOmZ1bmN0aW9uKCl7dGhpcy5ocz0xMDt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO3RoaXMuaWN8fCh0aGlzLmljPTAsYi5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMudSgiYWRlcnJvciIpO3RoaXMubSgpfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe30pKTt3aW5kb3cudmlkZW9wbGF6YT8KKHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmU/KHdpbmRvdy52aWRlb3BsYXphLmNvcmUuQWRDYWxsTW9kdWxlfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5UcmFja2VyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5tb2RlbHx8KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucGFyc2V8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnJlcXVlc3R8fCh0aGlzLnUoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubSgpKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLAoidmlkZW9wbGF6YSIpLHRoaXMubSgpKSx3aW5kb3cudmlkZW9wbGF6YS52ZXJzaW9uTnVtYmVyfHwodGhpcy51KCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm0oKSkpOih0aGlzLmljfHx0aGlzLmljKyssdGhpcy5pYzw9dGhpcy5ocz8odGhpcy5pYysrLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksNTAwKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5tKCkpKX0sbTpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCk/KHRoaXMuZ2V0UGxheWVyKCkuRXUoKSx0aGlzLkcoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIEJiPWMuV2x8fEJiOyhmdW5jdGlvbihjKXtjLllsPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm10di1wbGF5ZXItY29udGFpbmVyIiksCmE9ITE7YiYmYlswXSYmKGE9YlswXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSkmJmFbMF0mJndpbmRvdy5wbGF5ZXJBcGkmJndpbmRvdy5wbGF5ZXJBcGkucGxheWJhY2smJmImJihiPW5ldyBBYih3aW5kb3cucGxheWVyQXBpKSx0aGlzLk4oYil8fCh0aGlzLlIoYiksKG5ldyBCYihiLHRoaXMuSSkpLmcoKSkpO3RoaXMuVCgpfX0pfSkoYyk7dmFyIENiPWMuWWx8fENiLERiPW5ldyBDYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5sdj10aGlzLmFbNl07dGhpcy5lcj10aGlzLmFbNF07dGhpcy5Mcz10aGlzLmFbN107dGhpcy5Ubj10aGlzLmFbN107dGhpcy5Daz10aGlzLmFbM107dGhpcy5icD10aGlzLmFbMV07dGhpcy5udj10aGlzLmFbMl07dGhpcy5Zbz10aGlzLmFbN107dGhpcy5Scj10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVs4XX1jLmptPWI7Yi5wcm90b3R5cGU9CntrdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMubHY6dGhpcy5kcihhKX0sZHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmVyOnRoaXMuS3MoYSl9LEtzOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5Mczp0aGlzLlNuKGEpfSxTbjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuVG46dGhpcy5CayhhKX0sQms6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkNrOnRoaXMuYXAoYSl9LGFwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5icDp0aGlzLm12KGEpfSxtdjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnY6dGhpcy5YbyhhKX0sWG86ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLllvOnRoaXMuUXIoYSl9LFFyOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuUnI6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBFYj1jLmptfHxFYixSYz1uZXcgRWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksCiJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9UmMua3YoNCk7KGZ1bmN0aW9uKGMpe2MuVWw9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlLnBhcmVudE5vZGU7dGhpcy5WKGIpO2I9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLlooYik7dGhpcy5pc1BsYXlpbmc9ITE7Yi5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIixmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPSEwfS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9IiI7Yi5jdXJyZW50VGltZSYmKGE9Yi5jdXJyZW50VGltZSk7CnJldHVybiBhfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IuZHVyYXRpb24mJihhPWIuZHVyYXRpb24pO3JldHVybiBhfSxMYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0Q3VycmVudFRpbWUoKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiZhJiYxPmEtYj90aGlzLlcoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGEoKX0uYmluZCh0aGlzKSwyMDApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIlJhZGlhbnRNUCJ9fSl9KShjKTt2YXIgRmI9Yy5VbHx8RmI7KGZ1bmN0aW9uKGMpe2MuVGw9di5leHRlbmQoe2w6ZnVuY3Rpb24oYixhKXt0aGlzLm8oYixhKX0sZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuR2EoKSxhPXRoaXMuZ2V0UGxheWVyKCkudmlkZW9UYWc7YSYmYS5hZGRFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLGZ1bmN0aW9uKCl7dGhpcy5yYSgpO3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nPQohMX0uYmluZCh0aGlzKSk7dGhpcy5nZXRQbGF5ZXIoKTtiLmFkZEV2ZW50TGlzdGVuZXIoInBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy5TbygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkbG9hZGVkIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImFkc3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yj10aGlzLmtkKCk7MDxiLmdldEN1cnJlbnRUaW1lKCk/dGhpcy5XcigpOnRoaXMuZmcoKTtiLmF1dG9wbGF5JiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTmYoKXx8KHRoaXMudSgiY29udGVudHBsYXkiKSx0aGlzLm0oITApKX0uYmluZCh0aGlzKSwxRTMpfSxTbzpmdW5jdGlvbigpe3RoaXMuTmYoKXx8dGhpcy5tKCEwKX0sV3I6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtkKCk7IWIubmEmJmIuWCYmYi5KdyYmYi5MdyYmKHRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSwKdGhpcy5tKCkpfSxmZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMua2QoKTtiLmFkc0xvYWRlcj9iLmFkc0xvYWRlci5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7dmFyIGI7YTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOih0aGlzLnUoImFkZXJyb3IiLGIpLHRoaXMubSgpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZnKCl9LmJpbmQodGhpcyksMTAwKX0sa2Q6ZnVuY3Rpb24oKXtpZighdGhpcy5vaClmb3IodmFyIGI9bS5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuR2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5pZD09YSYmKHRoaXMub2g9YltjXSk7cmV0dXJuIHRoaXMub2h9LApkeDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxtOmZ1bmN0aW9uKGIpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2I/dGhpcy5rZCgpLmFkc0xvYWRlcj90aGlzLkcoITApOnRoaXMuRygpOnRoaXMuRygpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHYj1jLlRsfHxHYjsoZnVuY3Rpb24oYyl7Yy5WbD1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXtpZihtJiZtLnBsYXllcmFwaSl7dmFyIGI9bS5wbGF5ZXJhcGkoKTtpZihiLmxlbmd0aCl7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspe3ZhciBjPW5ldyBGYihkb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdLmlkKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7CnRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IEdiKGMsdGhpcy5JKSkuZygpKX1yZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIEhiPWMuVmx8fEhiLEliPW5ldyBIYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5xdj10aGlzLmFbM107dGhpcy5taz10aGlzLmFbNV07dGhpcy5qPXRoaXMuYVsxMF19Yy5XaT1iO2IucHJvdG90eXBlPXtwdjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMucXY6dGhpcy5sayhhKX0sbGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLm1rOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgSmI9Yy5XaXx8SmIsU2M9bmV3IEpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ClNjLnB2KDQpOyhmdW5jdGlvbihjKXtjLklrPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtHJiYoYj1iLmZpcnN0Q2hpbGQpO2lmKGIpe3RoaXMuVihiKTtpZihiLnRhZ05hbWUpe3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImVtYmVkIilbMF0pfWE/dGhpcy5aKGEpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sYng6ZnVuY3Rpb24oKXt2YXIgYj0hMTswPD1lLkJjKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmluZGV4T2YoInNwaWVnZWwuZGUiKSYmKGI9ITApO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe2lmKEcpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0sCnBsYXk6ZnVuY3Rpb24oKXtpZihHKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5fcGxheS5jb250cm9sLmludGVyYWN0LnBsYXkoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGxheSIpfSxKYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWc7cmV0dXJuIGImJiFiLnBhdXNlZD8odGhpcy5wYXVzZSgpLCEwKTohMX0sUDpmdW5jdGlvbigpe3JldHVybiJuZXh0In0sSWM6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sR2E6ZnVuY3Rpb24oKXt2YXIgYjtHPyhiPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiLmlkKS5maXJzdENoaWxkKTpiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKTtiIT10aGlzLmNvbnRhaW5lciYmKHRoaXMuY29udGFpbmVyPWIpO3JldHVybiB0aGlzLmNvbnRhaW5lcn19KX0pKGMpO3ZhciBYPQpjLklrfHxYOyhmdW5jdGlvbihjKXtjLkhrPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LGc6ZnVuY3Rpb24oKXt0aGlzLlNlPSIiO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YiYmKHRoaXMuU2U9Yi5pZCk7Rz93aW5kb3cuX3BsYXkuY29uZmlnLmFkZEFkZG9uTGlzdGVuZXIoZnVuY3Rpb24oYSl7dmFyIGI9YS5wbGF5ZXJDb250YWluZXI7YiYmdGhpcy5TZSYmYiE9dGhpcy5TZXx8ImFkZXJyb3IiIT1hLmV2ZW50fHxlLnphKCJ0ZWxlNS5kZSIpJiYicG9zdHJvbGwiPT1hLmFkVHlwZXx8KGEuYWRVUkwmJihtLmFkVGFnPWEuYWRVUkwpLHRoaXMudSgiYWRlcnJvciIsYS5qeCksdGhpcy5HKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnJhKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmCih0aGlzLnUoImFkZXJyb3IiKSx0aGlzLkcoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucmEoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgWT1jLkhrfHxZOyhmdW5jdGlvbihjKXtjLkprPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0c9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihHKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFgoYiksYi5tYXx8dGhpcy5OKGIpfHwodGhpcy5SKGIpLGI9bmV3IFkoYix0aGlzLkkpLGIuZygpKX1lbHNlIGlmKGI9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcigpKSliPW5ldyBYKGIpLGIubWE/dGhpcy5YZSgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBZKGIsdGhpcy5JKSxiLmcoKSl9dGhpcy5UKCl9fSl9KShjKTt2YXIgRyxLYj1jLkprfHxLYixMYj1uZXcgS2IoZ2EpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV0PXRoaXMuYVs2XTt0aGlzLlJqPXRoaXMuYVs2XTt0aGlzLmNqPXRoaXMuYVs2XTt0aGlzLmp2PXRoaXMuYVsxMF07dGhpcy5Uaz10aGlzLmFbNV07dGhpcy5Nbj10aGlzLmFbMl07dGhpcy5xcj10aGlzLmFbMTBdO3RoaXMuaj10aGlzLmFbN119Yy5mcz1iO2IucHJvdG90eXBlPXtEdDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuRXQ6dGhpcy5RaihhKX0sUWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5Sajp0aGlzLmJqKGEpfSxiajpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuY2o6dGhpcy5pdihhKX0saXY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmp2OnRoaXMuU2soYSl9LFNrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Uazp0aGlzLkxuKGEpfSxMbjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTW46dGhpcy5wcihhKX0scHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnFyOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgTWI9Yy5mc3x8TWIsVGM9bmV3IE1iKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VGMuRHQoNCk7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSwKYT0hMSxjPSExO2I/Yi5HZXRWaWRlb0VsP2IuR2V0RWw/KGE9Yi5HZXRWaWRlb0VsKCksYz1iLkdldEVsKCksYSYmYz8odGhpcy5WKGMpLHRoaXMuWihhKSk6dGhpcy5jYSgpKTp0aGlzLmNhKCk6dGhpcy5jYSgpOnRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLlBsYXkoKX0sSmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5Jc1BhdXNlZCgpPyExOih0aGlzLnBhdXNlKCksITApfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdvcmlsbGFNZWRpYSJ9LGd4OmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIE5iPWMuemp8fE5iOyhmdW5jdGlvbihjKXtjLnlqPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsCmEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5PbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSl9LG06ZnVuY3Rpb24oYil7dGhpcy5HKGIpfX0pfSkoYyk7dmFyIE9iPWMueWp8fE9iOyhmdW5jdGlvbihjKXtjLkFqPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsmJndpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcmsuR2V0QWxsUGxheWVycyl7dmFyIGI9d2luZG93LkdvcmlsbGFNZWRpYXBsYXllckZyYW1ld29yay5HZXRBbGxQbGF5ZXJzKCk7aWYoYiYmMDxiLmxlbmd0aClmb3IodmFyIGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IE5iKGJbYV0pO2MubWF8fHRoaXMuTihjKXx8KHRoaXMuUihjKSwobmV3IE9iKGMsdGhpcy5JKSkuZygpKX19dGhpcy5UKCl9fSl9KShjKTsKdmFyIFBiPWMuQWp8fFBiLFFiPW5ldyBQYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ZcD10aGlzLmFbOV07dGhpcy5Rcz10aGlzLmFbN107dGhpcy5UbT10aGlzLmFbNF07dGhpcy5OaT10aGlzLmFbNl07dGhpcy5Ddz10aGlzLmFbNV07dGhpcy5TcT10aGlzLmFbMl07dGhpcy5Vcz10aGlzLmFbMTBdO3RoaXMuYWo9dGhpcy5hWzFdO3RoaXMuaj10aGlzLmFbM119Yy5zaj1iO2IucHJvdG90eXBlPXtYcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWXA6dGhpcy5QcyhhKX0sUHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLlFzOnRoaXMuU20oYSl9LFNtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5UbTp0aGlzLk1pKGEpfSxNaTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTmk6dGhpcy5CdyhhKX0sQnc6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/CnRoaXMuQ3c6dGhpcy5ScShhKX0sUnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlNxOnRoaXMuVHMoYSl9LFRzOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Vczp0aGlzLiRpKGEpfSwkaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuYWo6dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuajphfX19KShjKTt2YXIgUmI9Yy5zanx8UmIsVWM9bmV3IFJiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VWMuWHAoNCk7KGZ1bmN0aW9uKGMpe2MuUW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIik7aWYoYiYmYlswXSl7Zm9yKHZhciBhPWI9YlswXTthJiZhLnBhcmVudE5vZGU7KXtpZigiQk9EWSI9PWEucGFyZW50Tm9kZS5ub2RlTmFtZSl7YT0KYS5wYXJlbnROb2RlO2JyZWFrfWE9YS5wYXJlbnROb2RlfXRoaXMuWihiKTt0aGlzLlYoYSl9ZWxzZSB0aGlzLmNhKCl9LE10OmZ1bmN0aW9uKCl7dGhpcy5PZD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7aWYoYi5kZXRhaWwpe2lmKCJjb250ZW50UGxheWVyUGxheSI9PWIuZGV0YWlsLm5hbWUpdHJ5e3dpbmRvdy5ETDhfb25BZENvbXBsZXRlZCgpLHRoaXMuT2Q9ITF9Y2F0Y2goYSl7fWlmKCJhZFJlcXVlc3QiPT1iLmRldGFpbC5uYW1lKXRyeXt0aGlzLk9kfHwodGhpcy5PZD0hMCx3aW5kb3cuREw4X29uQWRTdGFydGVkKCkpfWNhdGNoKGMpe319fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRQYXVzZVJlcXVlc3RlZCgpfWNhdGNoKGIpe3RoaXMudmlkZW9UYWcucGF1c2UoKX19LHBsYXk6ZnVuY3Rpb24oKXt0cnl7d2luZG93LkRMOF9vbkNvbnRlbnRSZXN1bWVSZXF1ZXN0ZWQoKX1jYXRjaChiKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LApKYTpmdW5jdGlvbigpe2lmKCF0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wYXVzZSgpLCEwfSxQOmZ1bmN0aW9uKCl7cmV0dXJuInh5bWF0aWMifX0pfSkoYyk7dmFyIFNiPWMuUW18fFNiOyhmdW5jdGlvbihjKXtjLlBtPXYuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIsYSl7dGhpcy5vKGIsYSl9LFF0OmZ1bmN0aW9uKGIpe2ImJmIuYWRkRXZlbnRMaXN0ZW5lciYmKGIuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCl9KSxiLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYi5hZGRFdmVudExpc3RlbmVyKCJhZHNNYW5hZ2VyTG9hZGVkIiwKZnVuY3Rpb24oKXt0aGlzLncoKX0pLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRzRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMudmMoYSl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy52YyhhKX0uYmluZCh0aGlzKSkpO2ImJmIuYWRkQWRFcnJvckxpc3RlbmVyJiZiLmFkZEFkRXJyb3JMaXN0ZW5lcihmdW5jdGlvbihhKXt0aGlzLnZjKGEpfS5iaW5kKHRoaXMpKX0sdmM6ZnVuY3Rpb24oYil7dmFyIGE9e307Yi5nZXRFcnJvciYmKGIuZ2V0RXJyb3IoKSxhPWIuZ2V0RXJyb3IoKSk7YS5nZXRFcnJvckNvZGU/KGEuZ2V0RXJyb3JDb2RlKCksdGhpcy51KCJhZGVycm9yIixhLmdldEVycm9yQ29kZSgpKSwxMDA5PT1hLmdldEVycm9yQ29kZSgpfHwzMDM9PWEuZ2V0RXJyb3JDb2RlKCl8fDQwMz09YS5nZXRFcnJvckNvZGUoKT90aGlzLncoKTp0aGlzLm0oKSk6KHRoaXMudSgibm9mcmFtZXdvcmsiKSx0aGlzLm0oKSl9LEpmOmZ1bmN0aW9uKCl7aWYod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldClmb3IodmFyIGI9CjA7Yjx3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0Lmxlbmd0aDtiKyspdGhpcy52Yyh3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0W2JdKTt0aGlzLnVhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuSmYuYmluZCh0aGlzKSwxMDApfSxnOmZ1bmN0aW9uKCl7d2luZG93Ll9fZGw4X2Fkc0xvYWRlciYmdGhpcy5RdCh3aW5kb3cuX19kbDhfYWRzTG9hZGVyKTt0aGlzLkpmKCk7dGhpcy5QdCgpfSxQdDpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsZnVuY3Rpb24oYil7dGhpcy52YyhiKX0uYmluZCh0aGlzKSk7d2luZG93LmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIngtZGw4LWhkLXB1c2gtZXJyb3ItYnVja2V0IixmdW5jdGlvbigpe30pfSxtOmZ1bmN0aW9uKGIpe3RoaXMuS3Q/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLAoxMDApfSxnbzpmdW5jdGlvbigpe3RoaXMuS3Q9ITB9fSl9KShjKTt2YXIgVGI9Yy5QbXx8VGI7KGZ1bmN0aW9uKGMpe2MuUm09cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93LkRMOF9HTE9CQUxTKXt2YXIgYj1uZXcgU2Iod2luZG93LkRMOF9HTE9CQUxTKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYi5NdCgpLGI9bmV3IFRiKGIsdGhpcy5JKSx3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFja3x8KHdpbmRvdy5ETDhfcmVxdWVzdEFkc0ZhbGxiYWNrPWIuZ28uYmluZChiKSksYi5nKCkpfXRoaXMuVCgpfX0pfSkoYyk7dmFyIFViPWMuUm18fFViLFZiPW5ldyBVYihnYSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuc3Y9dGhpcy5hWzVdO3RoaXMua3I9dGhpcy5hWzldO3RoaXMuRm49dGhpcy5hWzhdO3RoaXMua2s9CnRoaXMuYVs4XTt0aGlzLkJpPXRoaXMuYVs2XTt0aGlzLlh1PXRoaXMuYVs2XTt0aGlzLmx0PXRoaXMuYVs3XTt0aGlzLk5tPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzEwXX1jLmZxPWI7Yi5wcm90b3R5cGU9e3J2OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5zdjp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMua3I6dGhpcy5FbihhKX0sRW46ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZuOnRoaXMuamsoYSl9LGprOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5razp0aGlzLkFpKGEpfSxBaTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuQmk6dGhpcy5XdShhKX0sV3U6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlh1OnRoaXMua3QoYSl9LGt0OmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5sdDp0aGlzLk1tKGEpfSxNbTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuTm06dGhpcy5pKGEpfSxpOmZ1bmN0aW9uKGEpe3JldHVybiAyPAphP3RoaXMuajphfX19KShjKTt2YXIgV2I9Yy5mcXx8V2IsVmM9bmV3IFdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9VmMucnYoNCk7KGZ1bmN0aW9uKGMpe2MudW09dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dGhpcy5yaD0hMTt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9Nb2RlbCl7dmFyIGE9Yi52aWRlb01vZGVsLmdldCgicGxheWVyRWxlbWVudCIpO2lmKGEpe3RoaXMuVihhKTt2YXIgYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2N8fChjPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtjPyh0aGlzLlooYyksYi52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihhKXt0aGlzLnNzPWF9LmJpbmQodGhpcykpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsCmZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX1lbHNlIHRoaXMuY2EoKX0sZ3U6ZnVuY3Rpb24oKXt9LHFhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTE7cmV0dXJuIGIudmlkZW9Nb2RlbCYmYi52aWRlb01vZGVsLmdldCYmKGE9Yi52aWRlb01vZGVsLmdldCgidm9sdW1lIiksMDxhKT8hMTohMH0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LEphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5nZXQoImlzUGF1c2VkIik/ITE6KHRoaXMucGF1c2UoKSwhMCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3N9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LApQOmZ1bmN0aW9uKCl7cmV0dXJuInR2MiJ9LExhOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLm9ic2VydmUoInBvc2l0aW9uIixmdW5jdGlvbihiKXt0aGlzLkpkKGIpfS5iaW5kKHRoaXMpKX0sSmQ6ZnVuY3Rpb24oYil7dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmdldEN1cnJlbnRUaW1lKCk+YiYmKGI9dGhpcy5nZXRDdXJyZW50VGltZSgpKTt2YXIgYT10aGlzLmdldER1cmF0aW9uKCk7YiYmMDxiJiZhJiYwPGEmJmI+PWEtMSYmIXRoaXMucmgmJih0aGlzLnJoPSEwLHRoaXMuVyYmdGhpcy5XKCkpfX0pfSkoYyk7dmFyIE89Yy51bXx8TzsoZnVuY3Rpb24oYyl7Yy50bT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSx5YTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMub2UpaWYodGhpcy5DYnx8KHRoaXMuQ2I9MCksdGhpcy5DYisrLDE1PHRoaXMuQ2Ipe2lmKHdpbmRvdy5pbWEmJgp3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncyYmd2luZG93LmltYS5jb21tb24uZ2V0VmlkZW9NZXRhZGF0YSYmd2luZG93LmltYS5jb21tb24udHJpZ2dlck1lYXN1cmFibGVFdmVudClyZXR1cm4gd2luZG93LmNhblJ1bkFkcz90aGlzLnF1KCk6dGhpcy5tKCEwKSwhMDt0aGlzLnUoIm5vZnJhbWV3b3JrIiwiSU1BIik7Yi52aWRlb01vZGVsLmdldCgiYWRUYWdVcmwiKT90aGlzLm0oKTp0aGlzLm0oITApfWVsc2UgaWYoYj1iLnZpZGVvTW9kZWwuZ2V0KCJhZHNMb2FkZXIiKSl7dGhpcy5vZT0hMDt2YXIgYT0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO2IuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuZ2EoYSk7CnRoaXMuZWF8fCh0aGlzLnUoImFkZXJyb3IiLHRoaXMuUyksdGhpcy5tKCkpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy55YSgpfS5iaW5kKHRoaXMpLDEwKX0scWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYX0sZ2E6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGE/KGIuUz1hLGIudSgiYWRlcnJvciIsYSkpOmIudSgiYWRlcnJvciIpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYKImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxnOmZ1bmN0aW9uKCl7dGhpcy5TPXRoaXMuU3x8ITE7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLnlhKCk7Yi52aWRlb01vZGVsLm9ic2VydmUoInBsYXlTdGF0ZSIsZnVuY3Rpb24oYSl7InBsYXlpbmciPT1hJiYodGhpcy5pc1BsYXlpbmc9ITApfS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgicGxheU1vZGUiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiY3VycmVudEFkU2VnbWVudCIsCmZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiaXNBZHNQbGF5aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnMiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTtiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiYWRFcnJvcnNYIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoIk5PTl9FVkVOVCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpfSxtOmZ1bmN0aW9uKGIpe3RoaXMuaXNQbGF5aW5nP3RoaXMuRyhiKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubShiKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgUD1jLnRtfHxQOyhmdW5jdGlvbihjKXtjLnZtPXAuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKTt0aGlzLlRhPS0xfSxnOmZ1bmN0aW9uKCl7aWYod2luZG93Lmluc2VydGVkUGxheWVyKXt2YXIgYj0KbmV3IE8od2luZG93Lmluc2VydGVkUGxheWVyKTtiLm1hfHx0aGlzLk4oYil8fCh0aGlzLlIoYiksYj1uZXcgUChiLHRoaXMuSSksYi5nKCkpfWlmKHdpbmRvdy5UVjJQbGF5ZXJzJiZ3aW5kb3cuVFYyUGxheWVycy5sZW5ndGgpZm9yKHZhciBhPTA7YTx3aW5kb3cuVFYyUGxheWVycy5sZW5ndGg7YSsrKWI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSk7ZWxzZSBpZih3aW5kb3cuVFYyUGxheWVycylmb3IoYSBpbiB3aW5kb3cuVFYyUGxheWVycyl3aW5kb3cuVFYyUGxheWVycy5oYXNPd25Qcm9wZXJ0eShhKSYmd2luZG93LlRWMlBsYXllcnNbYV0udmlkZW9Nb2RlbCYmKGI9bmV3IE8od2luZG93LlRWMlBsYXllcnNbYV0pLGIubWF8fHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBQKGIsdGhpcy5JKSxiLmcoKSkpO3RoaXMuWGUoKTt0aGlzLlQoKX19KX0pKGMpO3ZhciBYYj1jLnZtfHwKWGIsWWI9bmV3IFhiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLkV3PXRoaXMuYVsxMF07dGhpcy54bz10aGlzLmFbM107dGhpcy5VaT10aGlzLmFbNl07dGhpcy5zcD10aGlzLmFbM107dGhpcy5sbD10aGlzLmFbMV07dGhpcy51cj10aGlzLmFbOV07dGhpcy5MbD10aGlzLmFbNl07dGhpcy56bT10aGlzLmFbM107dGhpcy5qPXRoaXMuYVs4XX1jLll1PWI7Yi5wcm90b3R5cGU9e0R3OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Fdzp0aGlzLndvKGEpfSx3bzpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG86dGhpcy5UaShhKX0sVGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVpOnRoaXMucnAoYSl9LHJwOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5zcDp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMubGw6dGhpcy50cihhKX0sCnRyOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy51cjp0aGlzLktsKGEpfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuTGw6dGhpcy55bShhKX0seW06ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnptOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuajphfX19KShjKTt2YXIgWmI9Yy5ZdXx8WmIsV2M9bmV3IFpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9V2MuRHcoNCk7KGZ1bmN0aW9uKGMpe2MucWs9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXJDb250YWluZXI7dGhpcy5WKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pOwp0aGlzLlooYSk7YSYmdGhpcy5WKGEucGFyZW50Tm9kZSl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4ibGFvbGExIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmFwaS5wYXVzZSgpfX0pfSkoYyk7dmFyIFo9Yy5xa3x8WjsoZnVuY3Rpb24oYyl7Yy5waz12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5PZz0wO3RoaXMuUz10aGlzLlN8fCExO3RoaXMuZ2V0UGxheWVyKCk7dGhpcy5lYT10aGlzLkRjPXRoaXMueWE9dGhpcy5VYz0hMTt0aGlzLnZoPWUuR2IoMTApO3RoaXMuWGcoKX0sWGc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGIuc3ViUGxheWVyJiZiLnN1YlBsYXllci5hZHNJbnRlcmZhY2UmJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIpcmV0dXJuIHRoaXMubmE9CmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZS5hZHNMb2FkZXIsdGhpcy5xYigpLCEwO3RoaXMuT2crKztpZigxMDx0aGlzLk9nKXRoaXMudSgibm9mcmFtZXdvcmsiLCJJTUEiKSx3aW5kb3cuaW1hJiZ3aW5kb3cuaW1hLmNvbW1vbiYmd2luZG93LmltYS5JbWFTZGtTZXR0aW5ncz90aGlzLm0oITApOnRoaXMubSgpO2Vsc2UgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuWGcuYmluZCh0aGlzKSwxMDApLCExfSxxYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMubmE7aWYoYil7dmFyIGE9ImFkRXJyb3IiLGM9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmCmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZS5MT0cmJihjPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7ImZ1bmN0aW9uIiE9PXR5cGVvZiBiLmFkZEV2ZW50TGlzdGVuZXI/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCl9LmJpbmQodGhpcyksMjApOihiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApfS5iaW5kKHRoaXMpKSxiLmFkZEV2ZW50TGlzdGVuZXIoYyxmdW5jdGlvbihhKXt0aGlzLmdhKGEsITApO3RoaXMudSgiYWRlcnJvciIsdGhpcy5TKTt0aGlzLmZhKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy51YSgpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucWIoKX0uYmluZCh0aGlzKSwyMCl9LGdhOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fAotMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5CYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTsKYnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITB9LGZhOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYT8odGhpcy53KCksdGhpcy50YSgpKTp0aGlzLm0oYil9LmJpbmQodGhpcyksMTAwKX0sbTpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2EuYXBpLnBsYXllZCYmYS5hcGkucGxheWVkKCk/dGhpcy5HKGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBhYT1jLnBrfHxhYTsoZnVuY3Rpb24oYyl7Yy5yaz1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9CjA7YTx3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGg7YSsrKWI9bmV3IFood2luZG93LmwxUGxheWVySW5zdGFuY2VbMF0pLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpO2Vsc2Ugd2luZG93LnBsYXllciYmd2luZG93LnBsYXllci5hcGkmJndpbmRvdy5wbGF5ZXIubDFQbGF5ZXImJihiPW5ldyBaKHdpbmRvdy5wbGF5ZXIpLHRoaXMuTihiKXx8KHRoaXMuUihiKSxiPW5ldyBhYShiLHRoaXMuSSksYi5nKCkpKTt0aGlzLlQoKX19KX0pKGMpO3ZhciAkYj1jLnJrfHwkYixhYz1uZXcgJGIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzFdO3RoaXMudms9dGhpcy5hWzRdO3RoaXMuSHM9dGhpcy5hWzVdO3RoaXMuZ3Q9dGhpcy5hWzJdO3RoaXMuR3A9dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbMl19Yy53cD1iO2IucHJvdG90eXBlPQp7cG86ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLnFvOnRoaXMudWsoYSl9LHVrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy52azp0aGlzLkdzKGEpfSxHczpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSHM6dGhpcy5mdChhKX0sZnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmd0OnRoaXMuRnAoYSl9LEZwOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5HcDp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmo6YX19fSkoYyk7dmFyIGJjPWMud3B8fGJjLFhjPW5ldyBiYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPVhjLnBvKDQpOyhmdW5jdGlvbihjKXtjLnVqPXQuZXh0ZW5kKHtsOmZ1bmN0aW9uKGIpe3RoaXMubyhiKX0sTTpmdW5jdGlvbigpe3ZhciBiPSExLGE9ITE7dHJ5e2I9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXS5wYXJlbnROb2RlLAphPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuVihiKSx0aGlzLlooYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5jYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxQOmZ1bmN0aW9uKCl7cmV0dXJuIkdBTlZpZGVvIn19KX0pKGMpO3ZhciBjYz1jLnVqfHxjYzsoZnVuY3Rpb24oYyl7Yy50aj12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dGhpcy5lZygpfSxlZzpmdW5jdGlvbihiKXt3aW5kb3cuR0FOX1ZpZGVvfHwoYj8odGhpcy51KCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuRygpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZWcoITApfS5iaW5kKHRoaXMpLDEwMCkpfX0pfSkoYyk7dmFyIGRjPWMudGp8fApkYzsoZnVuY3Rpb24oYyl7Yy52aj1wLmV4dGVuZCh7bDpmdW5jdGlvbihiKXt0aGlzLm8oYil9LGc6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgY2Mod2luZG93LiQoImRpdiNnYW1lIikpO2lmKGIubWEpe3RoaXMuVCgpO3JldHVybn1pZighdGhpcy5OKGIpKXt0aGlzLlIoYik7KG5ldyBkYyhiLHRoaXMuSSkpLmcoKTt0aGlzLlQoKTtyZXR1cm59fXRoaXMuVCgpfX0pfSkoYyk7dmFyIGVjPWMudmp8fGVjLGZjPW5ldyBlYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5IbD10aGlzLmFbMl07dGhpcy5KcT10aGlzLmFbMl07dGhpcy5ibz10aGlzLmFbOF07dGhpcy5xbT10aGlzLmFbNV07CnRoaXMuQm09dGhpcy5hWzNdO3RoaXMueG49dGhpcy5hWzRdO3RoaXMuTWs9dGhpcy5hWzhdO3RoaXMuTmo9dGhpcy5hWzJdO3RoaXMucXA9dGhpcy5hWzldO3RoaXMuaj10aGlzLmFbM119Yy5Vaj1iO2IucHJvdG90eXBlPXtHbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSGw6dGhpcy5JcShhKX0sSXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLkpxOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuYm86dGhpcy5wbShhKX0scG06ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnFtOnRoaXMuQW0oYSl9LEFtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5CbTp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMueG46dGhpcy5MayhhKX0sTGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLk1rOnRoaXMuTWooYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5Oajp0aGlzLnBwKGEpfSxwcDpmdW5jdGlvbihhKXtyZXR1cm4gNTwKYT90aGlzLnFwOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuajphfX19KShjKTt2YXIgZ2M9Yy5Vanx8Z2MsWWM9bmV3IGdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WWMuR2woNCk7KGZ1bmN0aW9uKGMpe2Muamk9dC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxNOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRXcmFwcGVyKCk7Yj8odGhpcy5WKGIpLChiPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pP3RoaXMuWihiKTp0aGlzLmNhKCkpOnRoaXMuY2EoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlVmlkZW8oKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheVZpZGVvKCl9LFA6ZnVuY3Rpb24oKXtyZXR1cm4iQVYifX0pfSkoYyk7CnZhciBoYz1jLmppfHxoYzsoZnVuY3Rpb24oYyl7Yy5paT12LmV4dGVuZCh7bDpmdW5jdGlvbihiLGEpe3RoaXMubyhiLGEpfSxnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDEwMCl9LmJpbmQodGhpcykpO2Iub24oImFkRnJhbWV3b3JrTm90QXZhaWxhYmxlIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTt0aGlzLmdlKCk7dGhpcy5iZygpfSxnYTpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGM9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuUz1hLGIudSgiYWRlcnJvciIsYSkpfXJldHVybiBjfQpiLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQmEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkJhKCk7YnJlYWt9fSxxZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhfSxCYTpmdW5jdGlvbigpe3RoaXMuZWE9ITA7dGhpcy53KCJlbXB0eSB2YXN0Iil9LGJnOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKaWYoYi5nZXRTZWxlY3RlZEFkSGFuZGxlcilpZigoYj1iLmdldFNlbGVjdGVkQWRIYW5kbGVyKCkpJiZiLmFkc0xvYWRlcilmb3IodmFyIGE9MDthPGIuYWRzTG9hZGVyLmxlbmd0aDthKyspe3ZhciBjPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGM9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZHNMb2FkZXJbYV0uYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3ImJihhPWEuZ2V0RXJyb3IoKSk7dmFyIGI9ITE7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYj0hMDtpZighYilmb3IodmFyIGMgaW4gYSl7aWYoYVtjXSYmYVtjXS5pbmRleE9mJiYoLTEhPWFbY10uaW5kZXhPZigiMTAwOSIpfHwtMSE9YVtjXS5pbmRleE9mKCIzMDMiKXx8Ci0xIT1hW2NdLmluZGV4T2YoIjQwMyIpKSl7Yj0hMDticmVha31pZihhW2NdJiYoMTAwOT09YVtjXXx8MzAzPT1hW2NdfHw0MDM9PWFbY10pKXtiPSEwO2JyZWFrfX1iPyh0aGlzLncoKSx0aGlzLnRhKCkpOnRoaXMubSgpfS5iaW5kKHRoaXMpKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYmcuYmluZCh0aGlzKSw1MCk7ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLmdlLmJpbmQodGhpcyksMTAwKX0sZ2U6ZnVuY3Rpb24oKXtpZighdGhpcy51YSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJwbGF5aW5nIj09Yi5nZXRQbGF5U3RhdGUoKT9iLmdldEFkSW5mbygpPyh3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMTApLHRoaXMudygpKTpiLl9wbGF5ZXJPcHRpb25zJiZiLl9wbGF5ZXJPcHRpb25zLnBsYXlBZHZlcnRpc2VtZW50c3x8Yi5fYWRSZWdpc3RlcmVkP3RoaXMubSgpOnRoaXMubSghMCk6d2luZG93LnNldFRpbWVvdXQodGhpcy5nZS5iaW5kKHRoaXMpLAoxMDApfX0sbTpmdW5jdGlvbihiKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnJhLmJpbmQodGhpcyksMUU0KTt0aGlzLkcoYil9fSl9KShjKTt2YXIgaWM9Yy5paXx8aWM7KGZ1bmN0aW9uKGMpe2Mua2k9cC5leHRlbmQoe2w6ZnVuY3Rpb24oYil7dGhpcy5vKGIpfSxZYTpmdW5jdGlvbihiKXtiPW5ldyBoYyhiKTtiLm1hP3RoaXMuVCgpOnRoaXMuTihiKXx8KHRoaXMuUihiKSwobmV3IGljKGIsdGhpcy5JKSkuZygpKX0sZzpmdW5jdGlvbigpe2lmKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzKWZvcih2YXIgYj0wO2I8d2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2IrKyl0aGlzLllhKHdpbmRvdy5zcmF2dnBsUGxheWVySW5zdGFuY2VzW2JdKTtlbHNlIHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQ/dGhpcy5ZYSh3aW5kb3cuc2V0dXBQbGF5ZXJFbGVtZW50KTp0aGlzLlQoKX19KX0pKGMpO3ZhciBqYz1jLmtpfHxqYyxrYz1uZXcgamMocik7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmJ1PXRoaXMuYVsyXTt0aGlzLnJsPXRoaXMuYVs4XTt0aGlzLlpqPXRoaXMuYVs3XTt0aGlzLmo9dGhpcy5hWzRdfWMucnc9YjtiLnByb3RvdHlwZT17YXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5idTp0aGlzLnFsKGEpfSxxbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMucmw6dGhpcy5ZaihhKX0sWWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlpqOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuajphfX19KShjKTt2YXIgbGM9Yy5yd3x8bGMsWmM9bmV3IGxjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9WmMuYXUoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuWmc9CnRoaXMuYWg9dGhpcy4kZz0hMTt0aGlzLndkPVtdO3RoaXMuV2U9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIGZjP251bGw6ZmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGFjP251bGw6YWMsVmlkZW9KUzoidW5kZWZpbmVkIj09PXR5cGVvZiBBYT9udWxsOkFhLGJpdG1vdmluOiJ1bmRlZmluZWQiPT09dHlwZW9mIFQ/bnVsbDpULG92VmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgRmE/bnVsbDpGYSxSYWRpYW50TVA6InVuZGVmaW5lZCI9PT10eXBlb2YgSWI/bnVsbDpJYixqdzoidW5kZWZpbmVkIj09PXR5cGVvZiB2YT9udWxsOnZhLHR2MjoidW5kZWZpbmVkIj09PXR5cGVvZiBZYj9udWxsOlliLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgTGI/bnVsbDpMYix4eW1hdGljUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFZiP251bGw6VmIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09CnR5cGVvZiBRYj9udWxsOlFiLGJpbGRNZWRpYVBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBwYj9udWxsOnBiLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiBlYj9udWxsOmViLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgRGI/bnVsbDpEYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgS2E/bnVsbDpLYSx3ZnY0OiJ1bmRlZmluZWQiPT09dHlwZW9mIHliP251bGw6eWIsQVZQbGF5ZXJEZXRlY3Rpb246InVuZGVmaW5lZCI9PT10eXBlb2Yga2M/bnVsbDprYyxPbmx5SE9NQUQ6InVuZGVmaW5lZCI9PT10eXBlb2YgVz9udWxsOld9fWMuT2w9YjtiLnByb3RvdHlwZT17ZzpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5BcShhKTpbXSxiO3RoaXMuYWg9ITA7aWYoYS5sZW5ndGgpe3RoaXMuJGc9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuQ2goYil9ZWxzZSBmb3IoYyBpbiB0aGlzLldlKXtpZih0aGlzLlpnKWJyZWFrOwpiPXRoaXMuV2VbY107dGhpcy5yZihiKSYmKHRoaXMud2QucHVzaChiKSx0aGlzLkNoKGIpKX19LHJmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgcD8hMDohMX0sQXE6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYztpZighYXx8IWEubGVuZ3RoKXJldHVybiBiO2Zvcih2YXIgZT0wO2U8YS5sZW5ndGg7ZSsrKWM9YVtlXSxjPXRoaXMuV2VbY10sdGhpcy5yZihjKSYmYi5wdXNoKGMpO3JldHVybiBifSxDaDpmdW5jdGlvbihhKXt0aGlzLnJmKGEpJiZhLmcoKX0sR3U6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHQmJiF0aGlzLiRnKWZvcih0aGlzLlpnPSEwLGE9MDthPHRoaXMud2QubGVuZ3RoO2ErKyl0aGlzLndkW2FdLktiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMud2RbYV0uS2IpfX19KShjKTt2YXIgbWM9Yy5PbHx8bWMsTT1uZXcgbWM7TS5nKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLkxvPXRoaXMuYVsxXTt0aGlzLlhqPXRoaXMuYVsxMF07dGhpcy5Pcz10aGlzLmFbNl07dGhpcy5HdD10aGlzLmFbMV07dGhpcy52dD10aGlzLmFbNV07dGhpcy5jcT10aGlzLmFbMTBdO3RoaXMuQ3A9dGhpcy5hWzEwXTt0aGlzLlhxPXRoaXMuYVs5XTt0aGlzLmo9dGhpcy5hWzldfWMuWnM9YjtiLnByb3RvdHlwZT17S286ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkxvOnRoaXMuV2ooYSl9LFdqOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Yajp0aGlzLk5zKGEpfSxOczpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuT3M6dGhpcy5GdChhKX0sRnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5HdDp0aGlzLnV0KGEpfSx1dDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMudnQ6dGhpcy5icShhKX0sYnE6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmNxOnRoaXMuQnAoYSl9LEJwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQ3A6dGhpcy5XcShhKX0sCldxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5YcTp0aGlzLmkoYSl9LGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5qOmF9fX0pKGMpO3ZhciBuYz1jLlpzfHxuYywkYz1uZXcgbmMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cuRD0kYy5Lbyg0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9Yy5maWxlbmFtZT9jLmZpbGVuYW1lOiIiO2lmKC0xIT1iLmluZGV4T2YoImhvbWFkIil8fC0xIT1iLmluZGV4T2YoImhkLW1haW4iKSliPWMubWVzc2FnZT9jLm1lc3NhZ2U6IiIsYz1jLmVycm9yLnN0YWNrP2MuZXJyb3Iuc3RhY2s6IiIsLTEhPWIuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKT8oYz1iLnN1YnN0cmluZyhiLmluZGV4T2YoIjoiKSsKMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGUueWMoay5DdiksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGUueWMoay5BcyksZS50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc2V0QXR0cmlidXRlKCJuYW1lIiwicG10bXZzIik7RS5zdHlsZS5kaXNwbGF5PSJub25lIjtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKEUpO3ZhciBhZD1FLmNvbnRlbnRXaW5kb3cuc2V0SW50ZXJ2YWwuYmluZCh3aW5kb3cpLHFjPUUuY29udGVudFdpbmRvdy5zZXRUaW1lb3V0LmJpbmQod2luZG93KTtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKEUpO3ZhciBJPW5ldyBKLG09ITE7SS5pYSgpO0kuVGcoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihJLmlhKCksZnVuY3Rpb24oYyl7bXx8KG09Yy5kZXRhaWwpfSwKITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEkuVGcoKSxmdW5jdGlvbihjKXttfHwobT1jLmRldGFpbCl9LCExKTtJLmlhKCk7dmFyIGJkPWFkKGZ1bmN0aW9uKCl7ZS52Zyh3aW5kb3csSS55cigpLHtpZDpiZH0pfSw1MDApLGlhPWUuYWEoMTApO2VhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMud3M9dGhpcy5hWzFdO3RoaXMuZGs9dGhpcy5hWzRdO3RoaXMuTm89dGhpcy5hWzZdO3RoaXMuaGw9dGhpcy5hWzEwXTt0aGlzLkxqPXRoaXMuYVsxXTt0aGlzLm90PXRoaXMuYVszXTt0aGlzLkdrPXRoaXMuYVszXTt0aGlzLlhrPXRoaXMuYVs2XTt0aGlzLkRzPXRoaXMuYVs4XTt0aGlzLmo9dGhpcy5hWzddfWMuTG09YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhtOnRoaXMudnMoYSl9LHZzOmZ1bmN0aW9uKGEpe3JldHVybiA0PAphP3RoaXMud3M6dGhpcy5jayhhKX0sY2s6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLmRrOnRoaXMuTW8oYSl9LE1vOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuTm86dGhpcy5nbChhKX0sZ2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5obDp0aGlzLktqKGEpfSxLajpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTGo6dGhpcy5udChhKX0sbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm90OnRoaXMuRmsoYSl9LEZrOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5Hazp0aGlzLldrKGEpfSxXazpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuWGs6dGhpcy5DcyhhKX0sQ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkRzOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuajphfX19KShjKTt2YXIgb2M9Yy5MbXx8b2MsY2Q9bmV3IG9jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy5EPWNkLldtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5zaD10aGlzLmNvbmY9dGhpcy5sYj10aGlzLnBsYXllcj1udWxsO3RoaXMucmQ9MDt0aGlzLiRhPSIiO3RoaXMueGQ9W107dGhpcy55ZD0wO3RoaXMudWg9ITE7dGhpcy5UZT1bXTtlLm9iKCJuZXdBZGRlbGl2ZXJ5Iil9Yy5saT1iO2IucHJvdG90eXBlPXtvdTpmdW5jdGlvbihhKXt0aGlzLnNoPWF9LGJmOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy4kYT10aGlzLnBsYXllci5QKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sanU6ZnVuY3Rpb24oYSl7dGhpcy5sYj1hfSxpdTpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLiRhXSYmdGhpcy5jb25mW3RoaXMuJGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy4kYV1bYV0pOwpyZXR1cm4gYn0sSmM6ZnVuY3Rpb24oYSxiKXtlLnphKCJ3ZWx0LmRlIikmJmUuWmEoImh0dHBzOi8vYXN2Lm51Z2dhZC5uZXQvYms/bnVnZ249MTU2OTkwNTEwMiZudWdnc2lkPTE5ODIyMTc1NTAmbnVnZ3JpZD0iK2VuY29kZVVSSUNvbXBvbmVudChsb2NhdGlvbi5ocmVmKSsiJm51Z2dsPWh0dHBzJTNBJTJGJTJGd3cyNTEuc21hcnRhZHNlcnZlci5jb20lMkZ0cmFjayUyRmNvbXAuYXNwJTNGa2V5d29yZCUzRE5VR0dWQVJTJTI2c2l0ZSUzRDg1MTQ1IiwibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMubGIpO3ZhciBjPSExLGY9ITE7aWYodGhpcy56cigpKXRoaXMubGIubCh0aGlzLmxiLm1kLHRoaXMubGIuRGEsdGhpcy5sYi5WZSxmdW5jdGlvbigpe3RoaXMuSmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLmxiLnhjKTtlbHNlIGlmKHRoaXMuUHEoKSl0aGlzLmN1KGZ1bmN0aW9uKCl7dGhpcy5KYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7CmUudihrLmFkLHRoaXMucGxheWVyLnMoKSk7dmFyIGc9dGhpcy5jb25mLGw9bmV3IFphKHRoaXMuZ2V0UGxheWVyKCksZyk7YiYmbC5JdSgpO2wuZXhpdEZ1bGxzY3JlZW4oKTtlLm9iKCJuZXdIb21hZERpc3BsYXkiKTtSPWw9bmV3IFFhKGwsdGhpcy5sYixnKTtsLmh1KHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9KGE9dGhpcy5ncyhhKSl8fGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJzaG93IiwhMCk7ImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGxheWVyLkRlJiYoYz10aGlzLnBsYXllci5EZSgpKTtnLmFkU3RhcnRUaW1lb3V0JiYoZj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe30sZy5hZFN0YXJ0VGltZW91dHx8NUU0KSk7bC5GZShhLGMsZik7dGhpcy5wbGF5ZXIuRWgobCl9fSx6cjpmdW5jdGlvbigpe3ZhciBhPQpuZXcgRGF0ZSxiPTA7aWYodGhpcy5yZClyZXR1cm4gYj1hLmdldFRpbWUoKS10aGlzLnJkLmdldFRpbWUoKSx0aGlzLnJkPWEsM0U1PGI/ITA6ITE7dGhpcy5yZD1hO3JldHVybiExfSx6dTpmdW5jdGlvbigpe2Uub2IoInByZXJvbGwiKTtlLmFmKCJwcmVyb2xsIik7dmFyIGE9dGhpcy5GYSgiYWRUYWciKTt0aGlzLkZhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy5GYSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMucmcoYSkpP3RoaXMuSmMoYSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJwcmUiLCEwKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMucGxheWVyLnBsYXkoKX0uYmluZCh0aGlzKSwwKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX0seXU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuc2gpe2UuYWYoInBvc3Ryb2xsIik7ZS5vYigicG9zdHJvbGwiKTt0aGlzLm91KCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSYmCihjPXRoaXMuRmEoInBvc3Ryb2xsQWRUYWciKSk7KGM9dGhpcy5yZyhjKSk/dGhpcy5KYyhjLGIucG9zdHJvbGxVc2VDb21wbGV0ZUV2ZW50PyEwOmEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicG9zdCIsITApLHRoaXMucGxheWVyLnBsYXkoKSxlLnYoay5iZCx0aGlzLnBsYXllci5zKCkpKX19LHJnOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxUdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLnN1KHRoaXMueXUuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuTGEoKX0sRGQ6ZnVuY3Rpb24oYSl7ZS5vYigibWlkcm9sbCIpO2UuYWYoIm1pZHJvbGwiKTtpZighdGhpcy5oaCl7dGhpcy5oaD0hMDt2YXIgYj10aGlzLkZhKCJhZFRhZyIpO3RoaXMuRmEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLkZhKCJtaWRyb2xsQWRUYWciKSk7CmI/KHRoaXMuSmMoYixhKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuaGg9ITF9LmJpbmQodGhpcyksMUUzKSk6KGUudHJhY2soInN0YXRzX2hkX25vQWRUYWciLCJtaWQiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS52KGsuYmQsdGhpcy5wbGF5ZXIucygpKSl9fSxTdDpmdW5jdGlvbigpe3RoaXMucGxheWVyLm51KHRoaXMuRGQuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuSWUoKX0sZzpmdW5jdGlvbigpe3RoaXMuenUoKTt0aGlzLnBsYXllci5JZSYmdGhpcy5TdCgpO3RoaXMuVHQoKX0sVXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtpZih0aGlzLmNvbmYueWllbGRsYWIpe3RoaXMuY29uZi55aWVsZGxhYlswXT9hPXRoaXMuY29uZi55aWVsZGxhYjphWzBdPXRoaXMuY29uZi55aWVsZGxhYjtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKykoZnVuY3Rpb24oYSxiLGMsZyl7dGhpcy54ZC5wdXNoKHsiZnVuY3Rpb24iOmZ1bmN0aW9uKGUpe3RoaXMud3coYSxiLGMsZyxlKX0uYmluZChlKX0pfSkuY2FsbCh0aGlzLAphW2JdLnVybCxhW2JdLnBsYWNlaG9sZGVyLGFbYl0uYWxpYXMsYVtiXS5tYWNybyl9dGhpcy55ZD10aGlzLnhkLmxlbmd0aH0sUHE6ZnVuY3Rpb24oKXt2YXIgYT0hMTswPHRoaXMueWQmJihhPSEwKTtyZXR1cm4gYX0sY3U6ZnVuY3Rpb24oYSl7dGhpcy51aD1hO2ZvcihhPTA7YTx0aGlzLnhkLmxlbmd0aDthKyspdGhpcy54ZFthXVsiZnVuY3Rpb24iXSh0aGlzLkJ0LmJpbmQodGhpcykpfSxCdDpmdW5jdGlvbihhKXt0aGlzLnlkLS07YSYmdGhpcy5UZS5wdXNoKGEpOzA+PXRoaXMueWQmJnRoaXMudWgoKX0sZ3M6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPHRoaXMuVGUubGVuZ3RoO2MrKyliPXRoaXMuVGVbY10sYT1hLnJlcGxhY2UoYi5tYWNybyxiLnBsYWNlaG9sZGVyKTtyZXR1cm4gYX19fSkoYyk7dmFyIGZhPWMubGl8fGZhLFI9ITEsbWE9ITE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLm9pPXRoaXMuYVs2XTt0aGlzLlZyPXRoaXMuYVsxMF07dGhpcy5qaj10aGlzLmFbMTBdO3RoaXMubnc9dGhpcy5hWzVdO3RoaXMuQXY9dGhpcy5hWzNdO3RoaXMua3c9dGhpcy5hWzFdO3RoaXMueXc9dGhpcy5hWzZdO3RoaXMub209dGhpcy5hWzFdO3RoaXMudXM9dGhpcy5hWzhdO3RoaXMuVm09dGhpcy5hWzNdO3RoaXMuaj10aGlzLmFbNl19Yy5ycz1iO2IucHJvdG90eXBlPXtuaTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub2k6dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlZyOnRoaXMuaWooYSl9LGlqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5qajp0aGlzLmx3KGEpfSxsdzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMubnc6dGhpcy56dihhKX0senY6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkF2OnRoaXMuaXcoYSl9LGl3OmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5rdzp0aGlzLnh3KGEpfSx4dzpmdW5jdGlvbihhKXtyZXR1cm4gNzwKYT90aGlzLnl3OnRoaXMubm0oYSl9LG5tOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vbTp0aGlzLnRzKGEpfSx0czpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudXM6dGhpcy5VbShhKX0sVW06ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlZtOnRoaXMuaShhKX0saTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuajphfX19KShjKTt2YXIgcGM9Yy5yc3x8cGMsZGQ9bmV3IHBjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LkQ9ZGQubmkoNCl9KS5jYWxsKGNlaVF1YWVmaGFpQnV4YWUsY2VpUXVhZWZoYWlCdXhhZSk7Cg==
- Protocol
- HTTP/1.1
- Security
- TLS 1.2,
ECDHE_RSA, AES_128_GCM
- Server
-
136.243.244.75
, Germany,
ASN24940
(HETZNER-AS, DE),
- Reverse DNS
- static.75.244.243.136.clients.your-server.de
- Software
-
cafe /
- Resource Hash
- ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
|
GET
H2
|
200
|
usersync
uss.xplosion.de/
|
42 B
662 B
|
38ms
38ms
|
Image
image/gif |
54.77.22.22
Amazon.com
|
|
|
GET
H/1.0
|
200
OK
|
o.gif
go.giga-abs.de/
|
35 B
355 B
|
32ms
31ms
|
Image
image/gif |
178.19.72.20
HGCOMP-ASN
|
|
|